从文件中读取long []的最快方法?

我有一个包含大约200,000个长度值的文件,我想尽可能快地读入长文件[]中。 这是一个Android应用程序; 函数调用速度很慢(因此任何涉及用“for”循环读取很长时间的任何内容都会超慢),并且我需要加载速度很快。 我可以使用什么? 我所看到的一切似乎只能快速读取字节。

我之前使用过NIO包中的ByteBufferFileChannel ,这似乎是从文件加载数组值的真正快速方法。 但是,我无法解决如何使用这个将数据读入long []。 我已经尝试了将Long []作为LongBuffer包装,但是我看不到任何可以将数据从文件提供给LongBuffer的方式。

编辑:无论我使用什么方法,我需要能够在Arrays.binarySearchlong[]数组上使用Arrays.binarySearch


没有办法将byte[]转换为long[] 。 但是,你可以尝试使用FileChannel阅读的内容到一个ByteBuffer ,然后获得的保持LongBuffer通过ByteBuffer.asLongBuffer从中你可以得到一个long[]通过LongBuffer.array()

您也可以尝试FileChannel.map来获取文件的MappedByteBuffer 。 这可能比通过FileChannel.read更快。

如果这不起作用,可以尝试使用FileChannel将内容读入ByteBuffer ,然后使用ByteBuffer.getLong(index)访问内部的long s。


另一种解决方案。 (循环中没有方法调用:-)

byte[] byteArray = new byte[longCount * 8];
FileInputStream fis = new FileInputStream("lotsoflongs");
fis.read(byteArray);
fis.close();
for (int i = 0; i < longCount; i += 8)
    longArray[i >> 3] = ((long) byteArray[0+i]        << 56) +
                        ((long)(byteArray[1+i] & 255) << 48) +
                        ((long)(byteArray[2+i] & 255) << 40) +
                        ((long)(byteArray[3+i] & 255) << 32) +
                        ((long)(byteArray[4+i] & 255) << 24) +
                              ((byteArray[5+i] & 255) << 16) +
                              ((byteArray[6+i] & 255) <<  8) +
                              ((byteArray[7+i] & 255) <<  0);

我现在已经基准了几个解决方案,而这个似乎是最快的方法。 另请注意,在fis.read(byteArray)读取的实际字节fis.read(byteArray)可能小于byteArray的实际大小。 因此,如果这应该被正确地完成,你需要把它放在一个循环中,直到所有字节被读取。


尝试使用DataInputStream。 既然你可以很容易地找出文件的长度,你也知道它包含了多少元素(文件大小/ 8字节)。

 DataInputStream dataStream = new DataInputStream(inputStream);

 long count = filesize/8;
 long[] longArray = new long[count];

 for(int i=0;i<count;i++) 
     longArray[i] = dataStream.getLong();

猜猜这应该足以给你一个想法。

链接地址: http://www.djcxy.com/p/48255.html

上一篇: Fastest way to read long[] from file?

下一篇: Mysql slow query: JOIN + multiple WHERES + ORDER BY