我们有大量的数据集(大约1.91亿条记录,将不断增长),每条记录都包含过滤器的值(11个过滤器-日期时间和整数值),以及一些额外的数据(成本)。例如:
Depature City = 1
Arrival City = 5
Country Id = 7
Check In Date = 2013-05-05
... etc
Cost 1250
... etc我们有一个有11个过滤器的搜索界面。在每个筛选器中,用户可以选择:一个值、一组值、所有值。
每个过滤器都有不同的可能值集,它可以从4到5000值不等。
搜索结果必须按上升成本排序,有分页(每页50个结果)。
每个搜索查询必须在100个mS内完成,通常预计为50-70个请求/秒(最大200次)。
数据往往会发生变化,但是数据变化的速度具有较低的优先级,搜索这个过程可能会比较慢。
组织这种搜索引擎的最佳方式是什么?内存中的数据(我们尝试了一些树算法)、Map (Hadoop?)、OLAP?
更新.你认为内存解决方案中的一些如何?这些记录可以以某种良好的搜索和排序结构加载到操作内存中。什么结构是最好的?
在生产环境中,客户端将能够提供合适的硬件以获得良好的解决方案。
一般来说,我们有一个.NET解决方案-所以,这个模块必须与它兼容。
发布于 2013-07-15 05:17:35
内存中的解决方案可能是可行的。由于您需要存储12个值x200m记录,您将需要大约20 of的RAM网(假设每个值8字节)。您将需要优化(在可能的情况下存储1/2/4字节值,并禁用内存对齐)。实际上,您可能需要一台64 or或更强的机器。
有人认为您负担不起使用需要大量小内存分配的数据结构。即使将数据存储在一个巨大的缓冲区中,您也可能需要为树结构索引分配很多小的资源。
树不太适合您的问题还有另一个原因:由于用户可能为每个过滤器选择一组值,因此您需要遍历树以寻找任何组合。这可能是大量的树木横越。
一个更简单的解决方案怎么样?选择将数据集划分为最大组数的2个过滤器(这可能是具有~5000值的过滤器)。使用2D数组。在每个单元格中,如果不是空的,则存储所有其余10个值的结构数组(9个筛选器+成本)。您可以通过第三大优势过滤器对这些数组进行排序。
在用户查询时,确定2D数组中的相关单元格,并根据相关单元格中的每个值检查输入(按第三大优势过滤器排序)。对于大多数单元格,需要检查的值要少得多。
根据数据分布的不同,可以使用稀疏矩阵而不是2D数组来节省一些内存。一些.NET稀疏矩阵实现可以在线获得。
发布于 2013-07-11 15:02:48
TrollModeOn我有个问题..。试图用非sql解决方案解决这个问题,现在我遇到了两个问题,/TrollModeOff.
在我看来,无sql解决方案并不适合处理这么多过滤器的内容。我从基于sql的解决方案开始。例如,如果我们有ms sql server,我们可以使用用户定义的表类型作为筛选器,类似于:
CREATE TYPE [FilterTable] AS TABLE(
[id] [int] NOT NULL --or any datatype needed
)之后,您可以将表类型作为参数传递给筛选存储过程(或使用sql查询完成),如下所示:
CREATE PROCEDURE [SomeFilterProcedureName]
@Filter1 FilterTable READONLY,
@Filter2 FilterTable READONLY
....你的问题应该是:
SELECT
field1,
field2,
field3
FROM MyTable t
WHERE
(@Filter1 IS NULL OR t.field1 IN (SELECT id FROM @Filter1))
AND (@Filter2 IS NULL OR t.field2 IN (SELECT id FROM @Filter2))
....
ORDER BY
whatever因此,基本上您检查您的参数是否包含一些值,如果有-您根据筛选参数数据筛选出列值。
RDBMS非常有效地存储、查找、过滤和排序大量的数据,但是您需要正确地调整它以使其工作得更快,例如,您需要设置正确的索引。此外,您还可以缓存数据一段时间,但要确保根据不同的参数构建正确的缓存键。
如果您的db服务器不足以每秒处理200个查询,您可能想要创建一个集群,或者使用几个具有相同数据的db服务器,并使用某种db均衡器。
upd:它太大了,不能放在评论中,
It the worst case he can select "All" for every 11 filter and we have to sort 192 million records to find 20-100 with the lowest cost
所有过滤器,最低成本?是不是和:Select top(20) * from someTableName order by cost一样。
Db Locks。更好地处理索引和查询。Sorting。好吧,你有1亿张符合过滤器的记录。你要怎么分类?QSort,MergeSort,BubbleSort?或者也许是stackoverflowSort?你知道你要选择哪一种海藻吗?但是,首先- DBMS知道,它选择最好的算法为情况,因为它有统计,第二,当然数据是预先存储在索引中。因此,每100 m记录排序操作都会杀死no-sql解决方案,但在rdbms上将工作得很好。High load。我们不是在说这个吗?在你的情况下,这不是真正的高负荷。有些公司每月拥有1亿到1.5亿活跃用户,拥有hella大型数据库,每秒有上千个查询,是的,他们使用rdbms。数十台服务器,分片,平衡,它的工作完美。发布于 2013-07-09 04:10:04
我认为HBase适合您的要求,为了.net兼容性,hadoop .net sdk可以从Horton:链接获得更多信息。
https://stackoverflow.com/questions/16949442
复制相似问题