首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何存储海量数据

如何存储海量数据
EN

Stack Overflow用户
提问于 2015-11-22 06:04:12
回答 4查看 109关注 0票数 0

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

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

对于DB和文件,有一个问题。我必须将数据分块处理。所以我加载数据块(比方说500mb),计算,加载下一个块,在我加载并计算完所有内容后,我可以做一些事情,重复这个循环。这意味着我将从HDD中读取与前一个周期中读取的相同数据块。

EN

回答 4

Stack Overflow用户

发布于 2015-11-22 06:08:47

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

Stack Overflow用户

发布于 2015-11-22 06:36:31

文件样式对您的任务来说已经足够了,夫妇示例:

  1. Use BuffereReader skip() method
  2. RandomAccessFile

阅读这两篇文章,重复数据块的问题就会消失。

票数 0
EN

Stack Overflow用户

发布于 2015-11-22 06:37:17

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

FutureTask可以帮助您:

代码语言:javascript
复制
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框架来处理大型数据集。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33849112

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档