从文件中读取long []的最快方法?
我有一个包含大约200,000个长度值的文件,我想尽可能快地读入一个long []中。这是一个Android应用程序;函数调用速度很慢(因此任何涉及用“for”循环读取很长时间的任何内容都会超慢),并且我需要加载速度很快。我可以使用什么?我所看到的一切似乎只能快速读取字节。从文件中读取long []的最快方法?
我以前使用过NIO软件包中的ByteBuffer
和FileChannel
,这似乎是一种非常快速的方法来从文件加载数组值。但是,我无法解决如何使用这个将数据读入long []。我已经尝试了将Long []作为LongBuffer包装,但是我看不到任何可以将数据从文件提供给LongBuffer的方式。
编辑:无论使用什么方法,我需要在末尾long[]
阵列上使用Arrays.binarySearch
。
没有办法将转换成 a byte[]
转换成long[]
。但是,您可以尝试使用FileChannel
将内容读取到ByteBuffer
,然后获取LongBuffer
到ByteBuffer.asLongBuffer
,从中可以得到long[]
到LongBuffer.array()
。
您也可以尝试FileChannel.map
以获得文件的MappedByteBuffer
。这可能比通过FileChannel.read
更快。
如果这不起作用,你可以尝试使用FileChannel
阅读的内容变成ByteBuffer
然后访问long
的内线它,使用ByteBuffer.getLong(index)
。
另一种解决方案。 (无法通话中环:-)
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)
中读取的实际字节数可能小于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();
猜测应该足以给你一个想法。
我不知道这些如何帮助。我看不出他们如何回答我的问题。 – memcom 2010-09-29 17:56:15