Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/388.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/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中读取、排序和合并多个文件的最快方法是什么?_Java_Performance_Sorting_Io_Large Data - Fatal编程技术网

在Java中读取、排序和合并多个文件的最快方法是什么?

在Java中读取、排序和合并多个文件的最快方法是什么?,java,performance,sorting,io,large-data,Java,Performance,Sorting,Io,Large Data,我正在从事一个项目,该项目涉及读取和处理包含特定个人的各种数据的巨大.txt文件 多个文件将按照单个ID(存在于所有文件中)进行读取和排序,然后根据从分配给相同ID的所有文件中检索所有条目的方式进行合并。换句话说,每个文件中可以有多个条目(即行)。我需要检索我找到的关于一个ID的所有信息,存储它,然后传递到下一个ID 到目前为止,我一直在尝试FileChannel、FileInputStream和MappedFileBuffer,但显然最适合我的情况是FileInputStream和Buffer

我正在从事一个项目,该项目涉及读取和处理包含特定个人的各种数据的巨大.txt文件

多个文件将按照单个ID(存在于所有文件中)进行读取和排序,然后根据从分配给相同ID的所有文件中检索所有条目的方式进行合并。换句话说,每个文件中可以有多个条目(即行)。我需要检索我找到的关于一个ID的所有信息,存储它,然后传递到下一个ID


到目前为止,我一直在尝试
FileChannel
FileInputStream
MappedFileBuffer
,但显然最适合我的情况是
FileInputStream
BufferedReader
进行比较,我发现推荐使用
Collection.sort()
。一个重要的问题是,我不知道将要使用该应用程序的PC的性能,并且文件可能大于2GB。任何帮助都将不胜感激。

如果文件足够大,您将不得不使用外部排序,在这种情况下,数据库真的开始成为最实用的选择。JDK中没有外部排序方法。

如果文件足够大,则必须使用外部排序,在这种情况下,数据库真正开始成为最实用的替代方法。JDK中没有外部排序方法。

如果您希望处理的数据超过目标环境所能容纳的内存,那么您必须使用某种形式的磁盘流或多次重新分析文件

关于采用哪种方案的决定取决于数据的分布

如果每个id有相对较少的行(即许多不同的id),那么如果您需要所有id的整理结果,那么重新分析将是最慢的

如果有相对较少的ID(即大量的行),那么重新分类可能会更有效


我的猜测是,在一般情况下,对每个id的重新分析效率很低(但是如果您知道可能存在如果您希望处理的数据超过目标环境可以容纳到内存中的数据量,那么您将不得不使用某种形式的磁盘流或多次重新分析文件)

关于采用哪种方案的决定取决于数据的分布

如果每个id有相对较少的行(即许多不同的id),那么如果您需要所有id的整理结果,那么重新分析将是最慢的

如果有相对较少的ID(即大量的行),那么重新分类可能会更有效



我的猜测是,在一般情况下,对每个id进行重新分类将是低效的(但如果您知道可能存在对数据库的限制?每个Id的预期行数和所有Id的总行数是多少files@KARASZIIstván对数据库没有限制,但文件的处理是在中间步骤中完成的(在每个步骤中,可能需要一个新的排序,具体取决于要遵循的工作流和应用程序中其他模块的中间输入).我想让它全部用Java编码,而不插入任何SQL语句或类似的语句,因为应用程序稍后将只传递给Java开发人员…所以它几乎是一个request@The每个ID的预期行数在所有文件中不会超过500行,ID的数量超过200-300万n针对数据库?每个Id的预期行数和所有Id的总行数是多少files@KARASZIIstván对数据库没有限制,但文件的处理是在中间步骤中完成的(在每个步骤中,可能需要一个新的排序,具体取决于要遵循的工作流和应用程序中其他模块的中间输入).我想让它全部用Java编码,而不插入任何SQL语句或类似的语句,因为应用程序稍后将只传递给Java开发人员…所以它几乎是一个request@The每个ID的预期行数在所有文件中不会超过500行,ID的数量超过200-300万。是的,我知道,我会的我也使用了数据库,但规范仅使用Java:/问题是我想在不包含重复ID的文件中逐行执行,并从其他文件中检索有关当前ID的所有信息。如果.indexOf()方法足够快。为什么不使用类似的方法呢?如果需要,它可以将表假脱机到本地存储,从而使您绕过任何内存限制。不过性能可能会受到影响。@Erik感谢您的建议,我将尝试将其与derby进行比较,看看性能会受到多大影响。是的,我知道,我会使用数据库,但规范仅使用Java:/问题是我想在不包含重复ID的文件中逐行搜索,并从其他文件中检索有关当前ID的所有信息。如果.indexOf()方法足够快。为什么不使用类似的方法呢?如果需要,它可以将表假脱机到本地存储,从而使您绕过任何内存限制。不过性能可能会受到影响。@Erik感谢您的建议,我将尝试将其与derby进行比较,看看性能会受到多大影响。只有当y您使用基于java的数据库,例如derby或hsqldbI,我对重新分析文件的想法是一样的,但我没有足够的每个ID的条目来提高效率。可用内存是一个问题,这就是尝试使用MappedFile缓冲区的原因,因为我可以保留必要的空间作为虚拟内存并将其传递给堆。我的想法是同时避免在磁盘上写入,因为这将耗费大量时间
Map<Id,List<Record>>