如何存储大量数据

时间:2015-11-21 22:04:12

标签: java performance

我有一个程序,它在开始时会生成大量数据(几GB,可能超过10GB),然后多次处理所有数据,做一些事情,处理所有数据,做一些事......那么多数据不适合我的RAM,当它开始分页时,它真的很痛苦。存储数据的最佳方式是什么?一般来说,如何解决这个问题?

即使我的程序结束后我不需要保存数据,我应该使用DB吗? 我应该以某种方式分割我的数据并将其保存到文件中并在需要时加载它们吗?或者只是继续使用RAM并重新进行分页?

使用DB和文件时出现问题。我必须按件处理数据。所以我加载数据块(比如说500mb),计算,加载下一个块,然后我加载并计算一切,我可以做一些事情并重复循环。这意味着我将从HDD中读取我在上一个周期中读取的相同数据块。

4 个答案:

答案 0 :(得分:0)

  • 尝试减少数据量。
  • 尝试修改算法,以便在早期阶段提取相关数据
  • 尝试划分和/或并行化问题,并在计算节点集群中的多个客户端上执行

答案 1 :(得分:0)

文件样式足以完成您的任务,情侣样本:

  1. Use BuffereReader skip() method
  2. RandomAccessFile
  3. 阅读这两篇文章,重复数据块的问题应该消失。

答案 2 :(得分:0)

您绝对应该尝试减少数据量并使用多个线程来处理数据。

FutureTask可以帮到你:

ExecutorService exec = Executors.newFixedThreadPool(5);
FutureTask<BigDecimal> task1 = new FutureTask<>(new Callable<BigDecimal>() {

   @Override
   public BigDecimal call() throws Exception {
      return doBigProcessing();
   }

});

// start future task asynchronously
exec.execute(task1);

// do other stuff

// blocking till processing is over
BigDecimal result = task1.get();

同样,如果可能的话,您可以考虑缓存未来的任务以加速您的应用程序。

如果还不够,您可以使用Apache Spark框架来处理大型数据集。

答案 3 :(得分:0)

在考虑表现之前,您必须考虑以下事项:

  • 为数据找到一个好的数据结构。
  • 找到处理数据的好算法。

如果没有足够的内存空间,

  • 使用内存映射文件处理数据

如果您有机会在不加载所有数据的情况下处理数据

  • 分而治之

请告诉我们更多细节。