我如何sorting非常大的文件
我有一些文件应该在每行的开头按照idsorting。 这些文件大约是2-3 GB。
我试图将所有数据读入一个ArrayList
并对其进行sorting。 但是记忆不足以让他们全部。 这是行不通的。
线条看起来像
0052304 0000004000000000000000000000000000000041 John Teddy 000023
0022024 0000004000000000000000000000000000000041 George Clan 00013
我怎样才能sorting文件?
这不完全是一个Java问题。 您需要研究一种有效的algorithm来sorting未完全读入内存的数据。 对Merge-Sort的一些修改可以实现这一点。
看看这个: http : //en.wikipedia.org/wiki/Merge_sort
和: http : //en.wikipedia.org/wiki/External_sorting
基本上这里的想法是将文件分解成更小的部分,对它们进行sorting(使用合并sorting或其他方法),然后使用合并sorting合并来创build新的sorting文件。
你需要一个外部合并sorting来做到这一点。 这是一个Java实现,它分类非常大的文件。
由于您的logging已经是平面文件文本格式,因此您可以将它们sort -n -t' ' -k1,1 < input > output
到UNIX sort(1)
例如sort -n -t' ' -k1,1 < input > output
。 它会自动分块数据,并使用可用内存和/tmp
进行合并分类。 如果您需要的空间比可用内存更多,请在命令中添加-T /tmpdir
。
每个人都在告诉你下载大量的C#或者Java库,或者在你可以使用一个在每个平台上可用的工具并且已经存在了几十年的时候实现合并sorting。
而不是一次加载所有的数据到内存中,你可以只读键和索引到哪里开始(也可能是长度),例如
class Line { int key, length; long start; }
这将使用每行大约40个字节。
对这个数组进行sorting后,就可以使用RandomAccessFile按照它们出现的顺序读取这些行。
注意:因为你会随机点击磁盘,而不是使用内存,这可能是非常缓慢的。 一个典型的磁盘需要8毫秒来随机访问数据,如果你有1000万行,这将需要大约一天的时间。 (这是绝对最坏的情况)在内存中大约需要10秒。
您可以使用SQL Lite文件数据库,将数据加载到数据库,然后让它sorting并返回结果为您。
优点:无需担心编写最好的sortingalgorithm。
缺点:您将需要磁盘空间,处理速度较慢。
https://sites.google.com/site/arjunwebworld/Home/programming/sorting-large-data-files
你需要做的是通过一个stream分块文件,并分别处理它们。 然后你可以将这些文件合并在一起,因为它们已经被sorting了,这与合并sorting的工作方式类似。
从这个问题的答案将是有价值的: stream大文件
操作系统带有强大的文件分类工具。 调用bash脚本的简单函数应该有所帮助。
public static void runScript(final Logger log, final String scriptFile) throws IOException, InterruptedException { final String command = scriptFile; if (!new File (command).exists() || !new File(command).canRead() || !new File(command).canExecute()) { log.log(Level.SEVERE, "Cannot find or read " + command); log.log(Level.WARNING, "Make sure the file is executable and you have permissions to execute it. Hint: use \"chmod +x filename\" to make it executable"); throw new IOException("Cannot find or read " + command); } final int returncode = Runtime.getRuntime().exec(new String[] {"bash", "-c", command}).waitFor(); if (returncode!=0) { log.log(Level.SEVERE, "The script returned an Error with exit code: " + returncode); throw new IOException(); } }