我正在处理一个很大的文本文件(755Mb)。我需要对行进行排序(大约1890000),然后将它们写回到另一个文件中。
问题是我无法将行存储在内存中的集合中,因为我收到了Java堆空间异常(即使我最大程度地扩展了它)。(已经尝试过!)
我不能用excel打开它并使用排序功能,因为文件太大并且无法完全加载。
我考虑过使用数据库..但是我认为编写所有行然后使用SELECT查询就执行时间而言太长了。我错了吗?
任何提示表示赞赏,谢谢
我认为这里的解决方案是使用临时文件进行合并排序:
读取第一个文件的前 n 行,( n 是您可以负担的存储量和在内存中排序的行数),对它们进行排序,然后将其写入文件1.tmp(或调用它)。对接下来的 n 行进行同样的操作,并将其存储在中2.tmp。重复直到处理完原始文件的所有行。
1.tmp
2.tmp
读取每个临时文件的第一行。确定最小的一个(根据您的排序顺序),将其写入目标文件,然后从相应的临时文件中读取下一行。重复直到所有行都已处理。
删除所有临时文件。
只要您有足够的磁盘空间,此方法就可以处理任意大文件。