Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Java中对2个大文本文件进行排序的最佳方法是什么?_Java_Sorting_Large Files - Fatal编程技术网

在Java中对2个大文本文件进行排序的最佳方法是什么?

在Java中对2个大文本文件进行排序的最佳方法是什么?,java,sorting,large-files,Java,Sorting,Large Files,我正在构建一个简单的java应用程序,它涉及从csv文件读取信息。csv文件中的信息以以下形式提供: "ID","Description" "AB","Some sort of information for AB" "AC","Some sort of information for AC" 我需要让用户在按id排序的控制台中打印描述、id或两者。最简单的解决方案是使用CSV库(如opencsv)解析文件,并将这些字符串放入树映射,然后打印树映射的内容。树映射中的键是ID,值是描述 然而,C

我正在构建一个简单的java应用程序,它涉及从csv文件读取信息。csv文件中的信息以以下形式提供:

"ID","Description"
"AB","Some sort of information for AB"
"AC","Some sort of information for AC"
我需要让用户在按id排序的控制台中打印描述、id或两者。最简单的解决方案是使用CSV库(如opencsv)解析文件,并将这些字符串放入树映射,然后打印树映射的内容。树映射中的键是ID,值是描述

然而,CSV文件可能是巨大的。它可能是5GB,将5GB的字符串加载到树映射中会导致内存不足错误。要处理大文件,我可以使用外部合并排序对文件进行排序。一旦得到排序后的文件,我就可以通过简单地读取文件将文件内容打印到控制台中

外部合并排序肯定比将文件内容加载到树映射中慢得多。我正在考虑检测文件大小。如果文件大小大于可用内存,那么我将使用外部合并排序。否则,我将把文件的内容加载到树映射中

然而,这意味着将有两个单独的代码块执行2种不同的排序。因此,增加了需要维护的代码量。如果你要写这个应用程序,你会考虑写2个分开的代码代码,将处理一个小CSV文件,和一个大的CSV文件分开。或者您只是使用不考虑文件大小的外部合并排序对文件进行排序

或者有没有其他方法可以替代这种方法


谢谢。

这取决于您的老板/客户为此分配了多少时间资源。如果这不是一个问题,那么当然需要有一个优化版本,其中包含两部分代码:对于较小文件的快速内存排序,对于较大文件的外部排序

当客户需要快速解决方案时,您可以问他:您想要一个文件大小不受限制的慢速解决方案,还是想要一个内存有限的运行速度更快的解决方案你会得到他想要的答复,对他来说也没问题:)-如果客户满意,你也一样


也许他想要一个实现:如果软件没有全额付款,那么它将只允许最大1GB的文件,以此类推。

自己解析csv文件,只将ID列添加到
树映射中,作为值记录该行的字节长度。在打印之后,使用
RandomAccessFile
读取相应的行。如果这种方法仍然溢出您的内存,请查看。它提供了TreeMap实现,可以无缝地溢出到磁盘,并具有出色的性能。

这是一个设计问题,可能会引起争论和多个有效的建议。它可能更适合你。我投票决定以“不具建设性”结束这里的讨论。@DuncanJones嗨,我非常高兴将此迁移到programmers.stackexchange.com。一旦我知道怎么做that@DuncanJones虽然我在stack overflow中有824个声誉,但在programmers.stackexchange.com上我只有113个声誉。这可能是我无法将此问题迁移到程序员的原因。stackexchange.comI不会太担心。你回答得很好。如果这是一个“非建设性”关闭,它可能不会被删除。为了将来的参考,迁移是通过标记问题来实现的,请版主注意。感谢您通知我有关MapDB的信息。我将为我的程序探索该API:)