从文件中读取long []的最快方法?
我有一个包含大约200,000个长度值的文件,我想尽可能快地读入长文件[]中。 这是一个Android应用程序; 函数调用速度很慢(因此任何涉及用“for”循环读取很长时间的任何内容都会超慢),并且我需要加载速度很快。 我可以使用什么? 我所看到的一切似乎只能快速读取字节。
我之前使用过NIO包中的ByteBuffer
和FileChannel
,这似乎是从文件加载数组值的真正快速方法。 但是,我无法解决如何使用这个将数据读入long []。 我已经尝试了将Long []作为LongBuffer包装,但是我看不到任何可以将数据从文件提供给LongBuffer的方式。
编辑:无论我使用什么方法,我需要能够在Arrays.binarySearch
的long[]
数组上使用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