gpt4 book ai didi

java - 外部排序优化

转载 作者:行者123 更新时间:2023-12-02 08:15:03 25 4
gpt4 key购买 nike

我必须用 Java 编写一个外部排序算法,仅使用 JVM RAM(基本上,我无法映射文件)。所以我想做的第一部分是从文件中分块读取数据。

我找到了this tutorial .

问题是教程是关于读取 byte 的,而我必须读取 int 。我不确定 IntBuffer 是如何实现的,但我认为它是字节缓冲区的包装器。鉴于这一事实,我能做的最快的事情是使用教程中的“带有直接 ByteBuffer 和字节数组的 FileChannel”方法(下面的代码),然后只需使用 int 创建单独的数组,对吗? s,我使用位操作“手动”从字节获取?

FileInputStream f = new FileInputStream( name );
FileChannel ch = f.getChannel( );
ByteBuffer bb = ByteBuffer.allocateDirect( BIGSIZE );
byte[] barray = new byte[SIZE];
long checkSum = 0L;
int nRead, nGet;
while ( (nRead=ch.read( bb )) != -1 )
{
if ( nRead == 0 )
continue;
bb.position( 0 );
bb.limit( nRead );
while( bb.hasRemaining( ) )
{
nGet = Math.min( bb.remaining( ), SIZE );
bb.get( barray, 0, nGet );
for ( int i=0; i<nGet; i++ )
checkSum += barray[i];
}
bb.clear( );
}

另外,我还有一个小问题:我想并行读取和排序(I/O 浪费大量时间),我应该使用一种完全不同的方法,还是在一个线程中使用此方法并在其中排序其他线程好方法吗?我真的很想为每一纳秒的性能而战。

最佳答案

new DataInputStream(new BufferedInputStream(new FileInputStream(file)));

然后使用readInt()。这将与您使用 FileChannel 执行的任何缺少映射文件的操作一样快,而且它们仅比普通 I/O 快 20% 左右。

直接字节缓冲区在这里也无济于事。当您不想自己查看或修改数据而只是在 channel 之间复制时,它们最有用。它避免了数据两次跨越 JNI/Java 边界,只是将其保留在 JNI 层内。不适用于本例。

关于java - 外部排序优化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6590366/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com