用Java排序一个非常大的文本文件

时间:2009-12-05 19:57:24

标签: java sorting text-files

我有一个需要在Java中排序的大文本文件。格式为:

字[tab]频率[新行]

排序算法是:

  • 阅读部分文件,过滤字母词。
  • 一旦你有X个字母单词,请调用Collections.sort并将结果写入文件。
  • 重复,直到您完成阅读文件。
  • 开始阅读两个已排序的文件,逐行比较频率较高的单词,同时写入新文件,以免加载到内存中
  • 重复,直到所有文件合并为一个大文件

现在我将大文件分成较小的文件(按降序排序),每行10,000行。我知道我需要以某种方式将这些文件合并在一起,但我不知道如何解决这个问题。

我创建了一个LinkedList来跟踪创建的所有文件。该算法说要比较两个文件中的每一行,除了我尝试过的情况,例如file1 = 8,6,5,3,1和file2 = 9,8,8,8,8。然后,如果我逐行比较它们,我会得到file3 = 9,8,8,6,8,5,8,3,8,1这是错误排序的(它们应该按降序排列)。

我认为我误解了算法的某些部分。如果有人可以指出我应该做什么,我会非常感激。感谢。

编辑:是的,这是一项任务。不幸的是,我们不允许增加记忆:(

2 个答案:

答案 0 :(得分:3)

你有正确的想法,但有一个小错误。当您从2个文件中读取行时,您不应该同时输出这两行,因为文件中具有较大数字的下一行可能仍然大于文件中具有较小数字的第一行(因为它在你的测试用例)。

所以,这很简单:

从每个文件中读取一行以开始。
然后重复一遍:
。具有最高值的行被写入新文件
。仅从该文件中读取另一行

这是基本算法,但当然你必须考虑当其中一个文件用完时会发生什么(在这种情况下你只是读取剩余文件中的行和输出 - 无论这是一个单独的循环还是一部分同样的循环取决于你 - 我会在做出决定之前看一下代码的样子。)

答案 1 :(得分:0)

如果文件太大而无法放入内存,请使用数据库。像MySQL这样的东西可能太重了,但是你可以在java中使用可嵌入的数据库。

其中一个是berkely DB,它是一个Key / value数据库系统。

Apache Derby是一个允许您使用SQL的关系数据库系统。

如果您已经了解SQL,那么德比可能是最简单的方法。我自己没有用过它。