将大量记录加载到内存中
本文关键字:内存 加载 记录 | 更新日期: 2023-09-27 17:50:55
每天有50万条记录,每条记录由~500字节组成,我们必须分析一年的记录。为了加快这个过程,最好是一次加载所有的记录,但我们不能,因为它需要~88 GB的内存。记录数将来可能会超过。
另一种方法是w.r.t.组加载这些记录,因为我们将这些记录作为组来分析,并且有25000个组,这可能会超过。
我们可以一次加载一个组,分析组,丢弃并加载另一个....但这导致了非常缓慢的进程,去数据库服务器25000次!!单线程进程使用内存中的数据比多线程进程(线程数为32)访问数据库要快得多。
有什么方法可以处理这种大数据的加载,并最小化。访问数据库的次数,或者加载一个大于可用内存大小的集合,或者一个可以包装按需加载数据的库(部分集合)?
您是否考虑过在一个请求中获取它们,然后在运行时丢弃它们?正在研究Hadoop集群?
如果不知道你的分析需要什么,提出任何建议都是徒劳的。
除了采用分布式方法(即让独立的机器并行运行分析,由中央控制器协调)之外,我能想到的唯一一件事可能是将数据库中的数据直接流式传输到将运行分析的机器的文件系统上的文件中(这可以作为运行分析的前兆)。
如果存储硬件很快(例如SSD),那么用分析程序中的文件读取替换数据库调用可能会提供更好的性能。
有必要将所有数据加载到内存中吗?例如,您想要进行的分析可能只需要记录的3个字段,而不是所有50个字段。考虑使用散列创建一个临时数据集,以减少所需的内存。也许你的数据是不必要的大,例如,当你只需要3个数字时,你使用bigint;当你只需要日期时,你使用date和time;当你只需要姓氏的前5个字母时,你使用varchar(100)。尝试截断数据以允许内存占用较少的初始处理。然后,您可以返回使用散列并查看更精细的细节,例如日期排序后的时间。因此,您可以在一个块中加载记录,转储不需要的数据部分,然后继续。
如果你能给我们更多的细节,你的数据看起来像什么,你想用它做什么,等,这将是有帮助的。或者至少是一个复制品,如果安全/隐私不允许你给我们真实的东西。不好意思,这太笼统了,使用我已有的
如果你有25000个组,它们是相互独立的,一个多线程的方法是更好的,其中有一个控制器线程根据负载产生其他"工作"线程,并为它们提供数据来工作。
控制器线程获取可以最优处理的数据量(在一次迭代中处理的多个组-受可用内存量的限制)并决定要扩展的线程数量。这也可以通过添加多个应用服务器,每个应用服务器都有不同的工作线程集来增强可扩展性。