排序具有内存约束的大文件-外部排序



我已经读了很多关于这个想法的书,我已经读到很多不同的人在问这个问题。我遇到了:http://javatroops.blogspot.ca/2012/12/sort-very-large-text-file-on-limited.html,我对它有一些疑问。(对不起,我不确定链接博客的确切规则)。

我理解外部排序的基础,我将文件分解为临时文件,然后对临时文件的数量执行合并排序。但是,这种方法会给I/O带来压力,不是吗?我可以通过多次n-way合并来限制一次打开的文件数量,但我希望找到改进。

所以读了上面的博客文章,我理解了解决方案2背后的想法,不太理解解决方案3,但我不理解它在Java中的实现。在这两种解决方案的中间,在文件被分割成临时文件之后,所有的文件都被读入BufferedReaders(关于bufferedreader和filerereader的小问题:它只是增加了缓冲并使I/O更快,但从程序员的角度来看不会改变可用性吗?),然后进行映射。这个映射过程不占用内存吗?我很困惑如何插入到TreeSet会占用内存,但放入TreeMap不会。解决方案3究竟是如何工作的?

然而,这种方法会强调I/O,不是吗,因为所有的文件?我可以通过多次n-way合并来限制一次打开的文件数量,但我希望找到改进。

使用内存总是会更快,至少快10 - 1000倍。这就是为什么我们使用内存,并且通常试图确保我们有足够的内存。如果你打算大量使用IO,你必须小心如何访问数据,因为你使用IO越多,你的速度就会越慢。

它只是增加了缓冲,使I/O更快,但从程序员的角度来看没有改变可用性吗?)

的主要优点是它支持读行。(它做缓冲)

内存映射文件可以导致更少的垃圾和开销,这取决于它们的使用方式,但你是对的,这不是很清楚。

内存映射文件使用非堆内存,可以更自然地交换进出。问题是,它将透明地使用所有可用的空闲内存。ie。你的堆限制不适用,所以你可以假装你只有40 MB的堆,但你不能假装你没有那么多的主内存。

解决方案3究竟是如何工作的?

我建议你问问作者到底是什么意思

最新更新