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外部排序效率_Java_Sorting_External - Fatal编程技术网

Java外部排序效率

Java外部排序效率,java,sorting,external,Java,Sorting,External,我必须用java编写一个外部排序程序,给定一个包含任意数量整数的文件a,只使用文件B(大小相同)作为临时存储对其进行排序。对于第一个阶段,我将文件块读取到ram中,使用内置java排序并写回文件B,但是这被证明是非常缓慢的。我想知道我的代码是否存在明显的低效?请注意,input1和output是RandomAccessFile对象集,BUFFER_SIZE是运行时由可用内存量决定的块大小 public void SortBlocks() throws IOException{ int s

我必须用java编写一个外部排序程序,给定一个包含任意数量整数的文件a,只使用文件B(大小相同)作为临时存储对其进行排序。对于第一个阶段,我将文件块读取到ram中,使用内置java排序并写回文件B,但是这被证明是非常缓慢的。我想知道我的代码是否存在明显的低效?请注意,input1和output是RandomAccessFile对象集,BUFFER_SIZE是运行时由可用内存量决定的块大小

public void SortBlocks() throws IOException{
    int startTime = (int) System.currentTimeMillis();
    input1.seek(0);output.seek(0);
    DataInputStream in = new DataInputStream(new BufferedInputStream(new FileInputStream(input1.getFD()),2048));
    DataOutputStream out = new DataOutputStream(new BufferedOutputStream(new FileOutputStream(output.getFD()),2048));
    int[] buffer = new int[BUFFER_SIZE];
    int j=0;
    for(int i=0; i<input1.length();i+=4){
        buffer[j] = in.readInt();
        j++;
        if(j == BUFFER_SIZE){
            writeInts(buffer,out,j);
            j=0;
        }
    }
    writeInts(buffer,out,j);
    out.flush();
    SwitchIO();
    int endTime = (int) System.currentTimeMillis();
    System.out.println("sorted blocks in " + Integer.toString(endTime-startTime));
}

    private static void writeInts(int[] Ints, DataOutputStream out, int size) throws IOException{
    Arrays.sort(Ints,0,size);
    for(int i=0;i<size;i++){
        out.writeInt(Ints[i]);
    }
}
public void SortBlocks()引发IOException{
int startTime=(int)System.currentTimeMillis();
input1.seek(0);output.seek(0);
DataInputStream in=新的DataInputStream(新的BufferedInputStream(新的FileInputStream(input1.getFD()),2048));
DataOutputStream out=新的DataOutputStream(新的BufferedOutputStream(新的FileOutputStream(output.getFD()),2048));
int[]buffer=新的int[buffer_SIZE];
int j=0;

对于(int i=0;i而言,最明显的低效率是使用
input1.length()
,这是一个相对昂贵的操作,您需要在每个
int
值上调用它

我不明白当默认值(8192)更有效时,为什么要减少缓冲区大小

如果您正在读取文件,我会使用ByteBuffer作为IntBuffer。瓶颈可能是您读取和写入数据的方式。按本机顺序使用
int
值将提高翻译性能。(而不是默认的big-endian)


如果您以内存映射文件的形式访问该文件,您可能能够优雅地处理大于内存大小的文件。

randomAccessFile有一个readInt和一个writeInt,为什么要用FileStream、BufferedStream和DataStream来包装它们,只需使用readInt和writeInt即可。这是一个家庭作业?因为这远远不是最有效的排序方式任意大的数据量。您应该先查看初始运行分布,然后是平衡或多相合并。是的,这是一项任务,我们必须在尽可能短的时间内尝试排序。我的解决方案有效,但我正在尝试优化。什么是运行分布和多相合并?如果您能提供一些为了回答ratchet freak,包装确保了缓冲I/O,这比为每个readInt()操作进行系统调用快得多。感谢您的帮助-调用length()只有一次将时间减少了14倍!我正在试验不同的缓冲区大小,但忘记了更改,尽管这似乎不是瓶颈所在。如果我将字节读入字节缓冲区,然后使用getInt将结果整数放入另一个数组,我不需要两倍的内存吗?我想这是值得的如果速度快得多,则需要权衡。如果将文件映射为IntBuffer,则不需要使用任何堆或直接内存。但是,不能使用数组。sort()也就是说,您必须编写自己的排序。不幸的是,内存映射是被禁止的-我们只允许使用分配给JVM的内存!是的-他们认为允许额外内存会破坏对象。我目前正在使用上述方法编写排序块,然后使用堆方法组合块。我的程序工作正常,我是j我们迫切需要进一步优化!我会在不进行排序(注释)的情况下测试您的应用程序,因为我希望您受到读/写数据方式的限制。如果没有不同的读/写数据方法,您需要更快的硬件来提高性能。