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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.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 - Fatal编程技术网

Java 外部排序优化

Java 外部排序优化,java,sorting,Java,Sorting,我必须用Java编写一个外部排序算法,只使用JVM RAM(基本上,我无法映射文件)。所以我要做的第一部分是从文件中分块读取数据 我找到了 问题是,本教程是关于阅读bytes的,我必须阅读ints。我不确定如何实现IntBuffer,但我认为它是字节缓冲区的包装器。考虑到这一事实,我能做的最快的事情是使用教程中的“FileChannel with direct ByteBuffer and byte array”(下面的代码)方法,然后使用ints创建单独的数组,我使用位操作“手动”从字节中获取

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

我找到了

问题是,本教程是关于阅读
byte
s的,我必须阅读
int
s。我不确定如何实现
IntBuffer
,但我认为它是字节缓冲区的包装器。考虑到这一事实,我能做的最快的事情是使用教程中的“FileChannel with direct ByteBuffer and byte array”(下面的代码)方法,然后使用
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( );
}
FileInputStream f=新的FileInputStream(名称);
FileChannel ch=f.getChannel();
ByteBuffer bb=ByteBuffer.allocateDirect(BIGSIZE);
byte[]baray=新字节[大小];
长校验和=0L;
印度国家可再生能源局;
而((nRead=ch.read(bb))!=-1)
{
如果(nRead==0)
继续;
bb.位置(0);
bb.限额(nRead);
while(bb.haslaining())
{
nGet=Math.min(bb.remaining(),SIZE);
bb.get(barray,0,nGet);
对于(int i=0;i
然后使用readInt()。这将与使用缺少映射文件的FileChannel所能做的任何事情一样快,并且它们只比普通I/O快20%左右


直接字节缓冲区在这里也帮不了你。当你不想自己查看或修改数据时,它们最有用,你只是在通道之间复制。它保存了两次跨越JNI/Java边界的数据,只是将其保存在JNI层内。不适用于这种情况。

如果你想争取一秒钟的peR性能购买速度更快的磁盘,例如使用SSD或RAID N或两者兼用。SSD驱动器传输数据的速度比移动磁盘快10倍。这将比Java中的任何操作都大得多。

我认为您应该先编写一些可以工作的东西,然后争取纳秒级的性能。您如何预测速度呃,当你不能测量它时?嗨,谢谢你的回答!那么,异步读取呢?它是如何实现的?它是尝试提前读取,还是我应该初始化单独的线程以提前读取?默认缓冲区大小是多少?谢谢你的帮助!在1.7之前的Java中没有异步读取。你只需要得到磁盘控制器的任何信息操作系统也有,这实际上是相当广泛的:缓存、预读,各种各样的东西。BufferedInputStream的默认缓冲区大小是8192(尽管没有指定),这应该足够了:如果没有,尝试使用它,在很大程度上,例如尝试64k。
new DataInputStream(new BufferedInputStream(new FileInputStream(file)));