将20 GB输入文件解析为ArrayList

时间:2014-01-31 10:35:06

标签: java

我需要按升序对20 GB文件(由随机数组成)进行排序,但我不明白应该使用哪种技术。我尝试在我的Java程序中使用ArrayList,但它耗尽了内存。增加堆大小也不起作用,我猜20 GB太大了。任何人都可以指导我,我该怎么办?

2 个答案:

答案 0 :(得分:9)

您应使用外部排序算法,不要试图将其放入内存中。

http://en.wikipedia.org/wiki/External_sorting

如果您认为它过于复杂,请尝试以下方法:

  1. 在项目中包含H2数据库
  2. 创建一个新的磁盘数据库(将在第一次连接时自动创建)
  3. 创建一些存储数字的简单表格
  4. 逐个数字读取数据并将其插入数据库(不要忘记提交每1000个数字左右)
  5. 使用ORDER BY子句选择数字:)
  6. 使用JDBC resultSet即时获取结果并将其写入输出文件
  7. H2数据库很简单,适用于Java,可以嵌入到JAR中(不需要任何安装或设置)。

答案 1 :(得分:4)

您真的不需要任何特殊工具。这是外部合并排序的教科书案例,其中您一次读取大文件的部分内容(比如100M),对它们进行排序,并将排序后的结果写入外部文件。读入另一部分,对其进行排序,将其吐出,直到没有任何东西可以排序。然后你需要读入已排序的块,一次读取一个较小的块(比如10M)并在内存中对它们进行排序。棘手的问题是以正确的方式将这些排序的位合并在一起。如上所述,也请阅读Wikipedia上的外部排序页面。此外,here是Java中的一种实现此类外部合并排序的实现。