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

问题描述:

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

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

编辑:无论使用什么方法,我需要在末尾long[]阵列上使用Arrays.binarySearch

+0

我不知道这些如何帮助。我看不出他们如何回答我的问题。 – memcom 2010-09-29 17:56:15

没有办法将转换成 a byte[]转换成long[]。但是,您可以尝试使用FileChannel将内容读取到ByteBuffer,然后获取LongBufferByteBuffer.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的实际大小。因此,如果这应该被正确地完成,你需要把它放在一个循环中,直到所有字节被读取。

+0

我需要能够通过例如long []之类的long []来使用long []。将它与Arrays.binarySearch一起使用 – memcom 2010-09-29 16:51:45

+0

如何实现一个由一个字节数组支持的'List',并使用Collections.binarySearch? – aioobe 2010-09-29 16:53:08

+0

我不确定这是什么意思?我将如何创建这样一个List对象? – memcom 2010-09-29 16:59:59

尝试使用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(); 

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

+0

OP排除了在for循环中一次读取很长一段时间。 – aioobe 2010-09-29 17:44:03

+0

@aioobe:你为什么不为一个LongBuffer实现你自己的binarySearch版本?应该相当容易,然后你就完成了。 :-) – mreichelt 2010-09-29 18:07:09