【问题标题】:Processing large amount of data in javajava处理大量数据
【发布时间】:2013-01-10 00:56:12
【问题描述】:

我正在对大型数据集实施聚类算法。数据集位于文本文件中,包含超过 1 亿条记录。每条记录包含 3 个数字字段。

1,1503895,4
3,2207774,5
6,2590061,3
...

如果可能,我需要将所有这些数据保存在内存中,因为根据我的聚类算法,我需要随机访问此文件中的记录。因此,我无法执行Find duplicates in large file 中所述的任何分区和合并方法

这个问题有哪些可能的解决方案?我可以使用 ehcache 之类的缓存技术吗?

【问题讨论】:

  • 用大量内存设置虚拟机?除此之外...
  • 文本文件有多大?使用适合的数据类型。看起来像一个字节,整数,字节?
  • 我和@SJuan76 在一起。听起来您的数据集在 ~1-2GB 范围内(将每个字段表示为一个 int),这是大多数体面的机器所拥有的。有关如何设置 JVM 最大堆大小的信息,请参阅 stackoverflow.com/questions/2294268/…
  • 或者,如果要进行一些预处理,您可以:a) 确保所有记录的长度相同(以字节为单位)以使用RandomAccessFile 读取每条记录(不知道如何效率将是,也许它取决于FS);或 b) 将数据划分为 100 条记录(左右)的块,要读取记录 2050,您需要打开文件 200 并读取第 50 条记录。

标签: java large-files


【解决方案1】:

3 亿个整数不应该消耗那么多内存。尝试实例化一个包含 3 亿个整数的数组。在 64 位机器上,我的手算大约是 1.2 GB。

【讨论】:

  • 感谢您的意见。早些时候我使用Hashmap 来存储我的记录对象。现在我将其更改为 ArrayList 而不是 Hashmap。现在我可以将我所有的对象都放入内存中了。
  • 在估算一个包含 3 亿个整数的数组需要多少内存时,为什么 CPU 架构(32 位或 64 位)很重要?
  • @jarnbjo 内存地址在 64 位环境中占用更多内存。根据 vm,int 之间可能有也可能没有填充,但使用原始类型的包装器也是如此
  • @AlanB 为了节省更多,以管理数组大小的额外复杂性为代价,尝试使用原始 int 数组。存储指向包装器的指针所涉及的开销较少。还要记住,arraylists 底层数组的大小在填充时会加倍。当被少量元素超出时,这可能会导致非常大的内存消耗跳跃
猜你喜欢
  • 2011-01-10
  • 2011-11-24
  • 1970-01-01
  • 1970-01-01
  • 2017-02-09
  • 2013-05-03
  • 2017-09-26
  • 1970-01-01
相关资源
最近更新 更多