2012-07-30 53 views
4

我有一个15亿长条目的数组。现在,我想写入磁盘并再次读回。任何人都可以帮助我有任何Java库(或自定义过程)来有效地做到这一点。Java如何写入/读取非常大的长阵列到文件中

通常,我使用FileChannel和MappedByteBuffer。但是,如果超过15亿美元,它就会超出限制。

编辑:

FileChannel ch = new RandomAccessFile(path, "r").getChannel(); 
MappedByteBuffer mb = ch.map(FileChannel.MapMode.READ_ONLY, 0, ch.size()); 
mb.order(ByteOrder.nativeOrder()); 
+0

您是否安装了64位JVM?为什么你需要把它全部读入内存?你如何计划处理它,因为可能有其他解决方案来解决这个问题。 – 2012-07-30 02:23:25

+0

你的男人是什么“超越极限”?你是不是想把它写出来?我总是读写千兆字节文件而没有问题。我肯定错过了什么。你有简单的代码吗? – MadProgrammer 2012-07-30 02:24:40

+0

@JamesBlack,我有64位的JVM。实际上,我有非常大的数据集包含很长的数字(15亿),我不得不将它加载到内存中。必须执行一些排序类型的工作,然后我必须写回结果。 – alessandro 2012-07-30 02:26:03

回答

1

我从来没有尝试过这种规模的对象,但我想你可以尝试换一个类implementig java.io.Serializable接口里面的数组:

class MyWrapper implements java.io.Serializable 
{ 
Object[] myArray; 
} 

然后,当您需要在磁盘上存储阵列时,只需使用接口方法即可完成:

FileOutputStream fouts = new 
     FileOutputStream("pathtofile"); 

    // Write object with ObjectOutputStream 
    ObjectOutputStream outobj= new 
     ObjectOutputStream (fouts); 

    // Write object out to disk 
    outobj.writeObject (myWrapperInstance); 

为了检索

FileInputStream infile = new 
    FileInputStream("pathtofile"); 

ObjectInputStream inobj = 
    new ObjectInputStream (infile); 

Object obj = inobj.readObject(); 

MyWrapper myWrapperInstance = (MyWrapper) obj;