使用MappedByteBuffer读取大文件~14GB文件

时间:2016-05-27 18:10:38

标签: java file io memory-mapped-files mappedbytebuffer

我正在尝试解决I / O密集型的生产者消费者问题。生产者常量将数据附加到文件,消费者从这个不断增长的文件中读取数据。文件大小通常为GB(约10GB)。

最初我尝试了BufferedOutputStream和BufferedInputStream来读写 数据到文件。在上午9:30发出的数据突发期间,它需要太多的系统CPU%,如30-40%(必须是I / O的系统调用)。

查看内存映射文件以加快速度。

    File fileToRead= new File("C:\\readThisFile.dat");
    FileChannel inChannel = new FileInputStream(fileToRead).getChannel();
    MappedByteBuffer buffer = inChannel.map(FileChannel.MapMode.READ_ONLY, 0, inChannel.size()); 
    byte[] data = new byte[(int)inChannel.size()];
    buffer.get(data);

1)由于文件readThisFile.dat size()大于INTEGER.MAX,因此inChannel.map()会引发异常。

2)消费者如何使用极大文件的内存映射文件不断读取数据。消费者每次可以加载100MB并继续寻找更多数据?

3)是否有更快的解决方案,比如在Java中尝试除内存映射文件以外的其他内容?

0 个答案:

没有答案