每天有50万条记录,每条记录包含~500字节,我们必须分析一年的记录。为了加快这个过程,最好一次加载所有记录,但我们不能,因为它需要~88 GB的内存。未来的记录数量可能会超过。
另一种方法是加载这些记录w.r.t.因为我们将这些记录分析为组,并且有25000个组,这些组也可能超过组。
我们可以一次加载一个组,分析该组,丢弃并加载另一个组....但这导致进程非常缓慢,进入数据库服务器25000次!!!内存中使用数据的单线程进程比多线程进程(线程数32)快得多,并且可以访问数据库。
我们是否有任何方法可以处理大量数据的加载并最小化no。访问数据库或加载大小超过可用内存的集合或可以包装按需加载数据的库(部分集合)?
答案 0 :(得分:1)
你有没有考虑过在一个请求中获取它们,然后沿着它们运行然后丢弃它们? LKooking进入Hadoop集群?
如果不知道您的分析需要什么,提出任何建议都是徒劳的。
答案 1 :(得分:1)
除采用分布式方法(即由并行运行分析的机器,由中央控制器协调)之外,我唯一能想到的可能是将数据从数据库直接流式传输到文件中。将运行分析的机器的文件系统(这可以作为运行分析的前提)。
如果存储硬件很快(例如SSD),那么用分析程序中的文件读取替换数据库调用可以提供更好的性能。
答案 2 :(得分:0)
是否有必要将所有数据加载到内存中?也许你想做的分析只需要3个记录字段而不是所有50个字段。考虑使用哈希创建临时数据集以减少您需要的内存。也许你的数据不必要地大,即当你只需要3个sig figs时你会使用bigint,当你只需要日期时你会使用日期和时间,varchar(100)当你只需要姓氏的前5个字母时。尝试截断数据以减少内存密集度的初始处理。然后你可以使用你的哈希返回并查看更精细的细节,比如日期排序后的时间。因此,您将在块中加载记录,转储不需要的数据部分,然后继续。
如果您向我们提供了有关您的数据的详细信息,您正在尝试使用它的内容等等的更多详细信息,那将会很有帮助。如果安全/隐私使您无法向我们提供真实的内容,请至少提供相应的传真信息。对不起,这是如此笼统,与我所拥有的一起工作。
答案 3 :(得分:-2)
如果你有25000个组,它们彼此独立,那么多线程方法会更好,其中有一个控制器线程根据负载产生其他“工作”线程,并为它们提供数据。
控制器线程获取可以最佳处理的数据量(在一次迭代中处理的多个组 - 受可用内存量限制)并决定要spwan的线程数。通过添加多个app服务器,每个服务器都具有不同的工作线程集,也可以使其更具规模。