0

每天有 50 万条记录,每条记录包含约 500 个字节,我们必须分析一年的记录。为了加快这个过程,最好一次加载所有记录,但我们不能,因为它需要约 88 GB 的内存。将来可能会超过记录数。

另一种方法是将这些记录加载到组中,因为我们将这些记录分析为组,并且有 25000 个组,这也可能超过。

我们可能一次加载一个组,分析该组,丢弃并加载另一个....但这会导致过程非常缓慢,访问数据库服务器 25000 次!!!。内存中可用数据的单线程进程比访问数据库的多线程进程(线程数 32)快得多。

有什么方法可以让我们处理这种大量数据的加载并最大限度地减少数量。访问数据库或加载大小超过可用内存的集合或可以包装按需加载数据(部分集合)的库?

4

4 回答 4

1

你有没有考虑过在一个请求中得到它们,沿着它们运行然后在你去的时候丢弃它们?LKooking 到 Hadoop 集群?

在不知道您的分析需要什么的情况下,提出任何建议都是徒劳的。

于 2013-01-08T06:42:26.750 回答
1

除了采用分布式方法(即让单独的机器并行运行分析,由中央控制器协调)之外,我唯一能想到的可能是将数据库中的数据直接流式传输到文件系统上的文件中将运行分析的机器(这可以作为运行分析的前兆)。

如果存储硬件速度很快(例如 SSD),那么在分析程序中用文件读取替换数据库调用可能会提供更好的性能。

于 2013-01-08T06:47:05.697 回答
0

Is it necessary to load all of your data into memory? Maybe the analysis you want to do only requires 3 fields of a record instead of all 50 fields for example. Consider creating a temporary dataset with a hash to lessen the memory you will require. Maybe your data is unnecessarily large, ie you're using bigints when you need only 3 sig figs, date and time when you only need the date, varchar(100) when you only need the first 5 letters of the last name. Try truncating data to allow a less memory intensive initial processing. then you can go back using your hash and look at finer details, like the time after the date has been sorted. So you would load records in a block, dump the portion of the data that is unneeded, and move on.

It would be helpful if you gave us more details of what your data looks like, what you are trying to do with it, etc. Or at least a facsimile of it if security/privacy keeps you from giving us the real thing. Sorry this is so general, working with what I've got.

于 2013-09-05T20:04:44.443 回答
-2

如果您有 25000 个彼此独立的组,则多线程方法会更好,其中有一个控制器线程可以根据负载生成其他“工作”线程,并为它们提供数据以供使用。

控制器线程获取可以优化处理的数据量(在一次迭代中处理的多个组 - 受可用内存量的限制)并决定要生成的线程数。这也可以通过添加多个应用程序服务器来提高可扩展性,每个应用程序服务器具有不同的工作线程集。

于 2013-01-08T06:46:48.183 回答