通过java程序读取大型输入文件(10gb)

时间:2011-07-21 13:45:55

标签: java memory-management file-io hadoop mapreduce

我正在使用每个5gb的2个大型输入文件。 它是Hadoop map reduce的输出,但由于我无法在Map reduce中进行依赖项计算,我将切换到优化的for循环进行最终计算(请参阅我之前关于map reduce design Recursive calculations using Mapreduce的问题

我想有关于在java中读取这些大文件并做一些基本操作的建议,最后我将写出大约5gb的数据。

感谢您的帮助

3 个答案:

答案 0 :(得分:1)

如果文件具有您所描述的属性,即每个键100个整数值,每个10GB,那么您谈论的是非常多的键,远远超出您可以适应内存的范围。如果您可以在处理之前订购文件,例如使用OS排序实用程序或使用单个reducer的MapReduce作业,您可以同时读取两个文件,执行处理和输出结果,而不会在内存中保留太多数据。

答案 1 :(得分:1)

听起来似乎没有太多简单的实现。只需为文件打开InputStream / Reader,然后循环播放:

  1. 读入一段数据
  2. 处理数据
  3. 将结果存储在内存中如果您有足够的空间存放整个数据集,则在某种数据库中如果不是
  4. 如果您的结果集太大而无法保留在内存中,一种简单的方法就是使用H2 database和本地文件存储。

答案 2 :(得分:0)

我的方法,

将map reduce程序配置为使用16个reducers,因此最终输出包含300个MB的16个文件(part-00000到part-00015),并且两个输入文件的键按相同的顺序排序。

现在在每个阶段我都会读取2个输入文件(大约600 MB)并进行处理。所以在每个阶段我都必须保持600 MB的内存,系统可以很好地管理。

该程序很快花了大约20分钟完成处理。

感谢所有建议!,感谢您的帮助