Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.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 使用较小的物理内存对10亿个整数进行排序_Java_Performance_Sorting_Memory_Ram - Fatal编程技术网

Java 使用较小的物理内存对10亿个整数进行排序

Java 使用较小的物理内存对10亿个整数进行排序,java,performance,sorting,memory,ram,Java,Performance,Sorting,Memory,Ram,如果要对10亿个整数进行排序,而我的系统只有1GB的RAM。什么是最快、最有效的排序方法 假设我们在文本文件中有一个输入,每行一个整数 我们正在使用java程序进行排序 我指定了RAM,因为我们不能保存RAM中的所有输入整数 更新:整数是7位数字。最简单的方法是将输入分解成可放入内存的较小文件,并对每个文件进行排序,然后合并结果 虽然显然不是同一种语言,但原理是相同的。您指定的是对十亿个7(十进制)数字进行排序 如果没有重复项,可以使用基数排序在内存中使用107位进行排序。由于必须有重复项(10

如果要对10亿个整数进行排序,而我的系统只有1GB的RAM。什么是最快、最有效的排序方法

  • 假设我们在文本文件中有一个输入,每行一个整数

  • 我们正在使用java程序进行排序

  • 我指定了RAM,因为我们不能保存RAM中的所有输入整数


  • 更新:整数是7位数字。

    最简单的方法是将输入分解成可放入内存的较小文件,并对每个文件进行排序,然后合并结果


    虽然显然不是同一种语言,但原理是相同的。

    您指定的是对十亿个7(十进制)数字进行排序

    如果没有重复项,可以使用基数排序在内存中使用107位进行排序。由于必须有重复项(107小于109),因此可以使用(比如)107个8位计数器的数组实现基数排序,并使用
    HashMap
    来处理计数器溢出的相对较少的情况。或者只是107个32位计数器的数组


    另一种更通用的方法(适用于任何类型的值)是将文件拆分为N个较小的子文件,在内存中对每个子文件进行排序,然后对排序后的子文件执行N向合并。

    使用具有40亿个可能值的位集占用512 MB。只需设置您看到的所有
    int
    值,并按顺序写出它们(它们自然排序)

    这只有在您不关心重复项的情况下才有效

    如果计算重复事项,我仍然会考虑内存映射文件进行计数,或者使用合并排序的数据子段。(我相信后者是一个预期的答案)


    我最近买了一台24 GB的PC,价格不到1千英镑,所以几GB并不是那么多,除非你受到托管解决方案的限制。(或使用移动设备)

    假设每个整数在读取文件时正好出现一次,并且对于找到的每个数字设置一个位-位数组必须容纳10000000位-这只使用1,28 MB RAM,该RAM应可用。。。读取完所有整数后,您只需遍历数组并输出位ist设置的数字

    整数是7位数

    因此,只有1000万个可能的值

    你有1GB的内存。制作一个计数器数组,每个计数器对应一个可能的值

    把文件读一遍,数一数计数器

    完成后,根据最终计数器值输出数字


    每个数字最多可以出现10亿次。所以32位计数器就足够了。这意味着一个10M x 4字节=40M字节的数组。

    可能的重复:请参阅此处的比较:。你挑吧@莱克:另一个问题没有空间限制。同样的问题回答了这些整数有多大?可以复制吗?您有用于临时文件的外部存储吗?只有在允许外部存储(或至少在适当位置更新输入文件)的情况下才有效。如果您只有1000万个可能的值,则可以根据您的操作方式在内存中保留1.25 MB到40 MB之间的值。@Peter我知道。但他的第三点与他1GB内存的陈述相矛盾,显然他无法将它们存储在内存中……可能它们是非常非常大的整数。@Gareth Davis-他(我认为)的意思是,他无法将未排序的列表存储在内存中。如果您仅限于7位数字,这不是最好的解决方案,请参阅Stephen C或Thilo的解决方案表。此解决方案将在线性时间而不是n log(n)时间内完成,并且还将保留内存。如果1000万个可能值中有10亿个数字,则其中至少一个必须出现多次。如果1000万个可能值中有10亿个数字,则其中至少一个必须出现多次。一个位集是不够的。这取决于你说“整数”时是指
    int
    还是
    Integer
    。如果是这样,则只能有2^32个值。如果有更多可能的值,例如100亿,则可以使用内存映射文件。我编写了一段代码,用1280亿位更新一个自定义位。如果它们只是7位数字,则只有1000万个值,需要1000万位或大约1.25 MB的内存。您可以使用32位计数来代替位,但仍然只使用40 MB内存。