Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/321.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/4/algorithm/10.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/9/javascript/373.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
Python 排序2^30个32位整数。最佳解决方案_Python_Algorithm_Sorting_Computer Science - Fatal编程技术网

Python 排序2^30个32位整数。最佳解决方案

Python 排序2^30个32位整数。最佳解决方案,python,algorithm,sorting,computer-science,Python,Algorithm,Sorting,Computer Science,我有一个包含2^30个无符号32位整数值的文件,我需要对它们进行排序,所以我想用最快的算法来完成。需要使用所有可用的处理器,并且使用的内存不超过256MB 我现在的想法是: 最大整数值(对于32位整数)Sm=2^32,最小值=0。可用内存为M=2^28 设备的输出文件 Sm*(sizeof int)/M=2^32*2^5/2^28=2^9个零件; 每个零件尺寸为2^32/2^9=2^23 首先,编写一个简单的读取器,从输入文件中读取int值,检查它位于什么范围内,并将这个范围内的整数放入te

我有一个包含2^30个无符号32位整数值的文件,我需要对它们进行排序,所以我想用最快的算法来完成。需要使用所有可用的处理器,并且使用的内存不超过256MB

我现在的想法是: 最大整数值(对于32位整数)Sm=2^32,最小值=0。可用内存为M=2^28

  • 设备的输出文件

    Sm*(sizeof int)/M=2^32*2^5/2^28=2^9个零件; 每个零件尺寸为2^32/2^9=2^23

首先,编写一个简单的读取器,从输入文件中读取int值,检查它位于什么范围内,并将这个范围内的整数放入tempfile。之后,我将有2^9个文件:

1 file= Integers from 0:2^23
2 file = 2^23:2^24
3 file = 2^24:(2^24+2^23),
and etc...
  • 使用标准算法进行排序,如qsort或金字塔排序(对此算法有何建议?)
我可以在这里使用类似Python.multiprocessing的东西来进行并行排序,但它需要在每个进程开始之前安全地计算可用的可用内存

你认为这种方法怎么样?可能存在更干净更容易的解决方案

  • 每次读取内存中适合的内容(我们称之为块),对其进行排序并将其写回磁盘(即对256 MB的块进行排序)
  • 同时打开所有块,从每个块中读取前n个条目并构建一个(其中n是指填充256 MB的数据块)
  • 从堆中获取最小元素(注意它来自哪个块),将其写入目标文件
  • 从同一输入块中读取下一个元素并将其添加到堆中,然后重复上一步,直到处理完所有数据
  • 256 MB是2^28字节或2^26(四字节)整数,因此您只需要对2^4=16个块进行排序

  • 每次读取内存中适合的内容(我们称之为块),对其进行排序并将其写回磁盘(即对256 MB的块进行排序)
  • 同时打开所有块,从每个块中读取前n个条目并构建一个(其中n是指填充256 MB的数据块)
  • 从堆中获取最小元素(注意它来自哪个块),将其写入目标文件
  • 从同一输入块中读取下一个元素并将其添加到堆中,然后重复上一步,直到处理完所有数据
  • 256 MB是2^28字节或2^26(四字节)整数,因此您只需对2^4=16个块进行排序。

    此处的关键点是“无符号32位整数值”。您可以使用。Wiki页面提供完整的

    由于内存不足,无法一次对所有内容进行排序,因此必须将工作划分为适合内存的部分,对每个部分进行排序,并将结果保存到磁盘,然后以类似于合并过程的方式合并结果。合并不需要将整个内容加载到内存中,只需在编写最终结果时读取部分内容

    “无符号32位整数值”是这里的关键点。您可以使用。Wiki页面提供完整的


    由于内存不足,无法一次对所有内容进行排序,因此必须将工作划分为适合内存的部分,对每个部分进行排序,并将结果保存到磁盘,然后以类似于合并过程的方式合并结果。合并不需要将整个内容加载到内存中,只需在编写最终结果时读取部分内容

    考虑使用MergeSort。可在此处找到简短说明:


    合并排序非常适合于并行实现和内存限制。

    考虑使用合并排序。可在此处找到简短说明:


    合并排序非常适合于并行实现和内存限制。

    基数排序通常被称为O(n),但实际上是O(nlogn),因为它需要与最大数字中的位数成比例的时间*数字计数,并且位数趋向于log(n)

    我建议使用3级复合排序:

  • insertionsort用于长度约为32或64的小子列表-基准测试,以找到最好的-timsort为您提供了这方面的内容
  • 最大物理内存量的大型子列表的timsort或merge排序。Python和Java使用timsort作为其排序方法,速度非常快,但这是一个比mergesort更复杂的算法,如果您使用的是C之类的语言,这一点很重要。因此,如果您只需要运行良好且简单的东西,请使用mergesort
  • 在“大型”中,使用“合并排序”合并包含已排序的大型子列表的已排序文件
  • Python的多处理模块允许您在共享内存中存储标量类型(如整数)的数组只是要记住一些事情


    一定要让每个核心排序一个大的子列表-这对多核系统会有很大帮助。有时对#3使用minheap是好的,有时最好只使用数组(对于较小数量的大型子列表)。

    基数排序通常被称为O(n),但实际上是O(nlogn),因为它需要与最大数字中的位数成比例的时间*数字计数,并且数字的数量趋向于log(n)

    我建议使用3级复合排序:

  • insertionsort用于长度约为32或64的小子列表-基准测试,以找到最好的-timsort为您提供了这方面的内容
  • 最大物理内存量的大型子列表的timsort或merge排序。Python和Java使用timsort作为其排序方法,速度非常快,但这是一个比mergesort更复杂的算法,如果您使用的是C之类的语言,这一点很重要。因此,如果您只需要运行良好且简单的东西,请使用mergesort
  • 在“大型”中,使用“合并排序”合并包含已排序的大型子列表的已排序文件
  • Python的多处理模块允许您在共享内存中存储标量类型(如整数)的数组绝对法
    a. [0, 2^20 - 1], [2^20, 2^21 - 1]....
    
    // for each part
    int start = 0;      // the starting point of the part
    int end = 2^20 - 1; // the ending point of the part
    int *hash = new int[end - start + 1];
    for (int i = start; i <= end; ++i) {
        // read a integer val
        ++hash[val];
    }
    for (int i = start; i <= end; ++i) {
        if (hash[i] > 0) {
            for (int j = 0; j < hash[i]; ++j) {
                // print i
            }
         }
    }