Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/306.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用MappedByteBuffer读取大文件~14GB文件_Java_File_Io_Memory Mapped Files_Mappedbytebuffer - Fatal编程技术网

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

Java 使用MappedByteBuffer读取大文件~14GB文件,java,file,io,memory-mapped-files,mappedbytebuffer,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:\\readThisFi

我正在努力解决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) 由于channel.map()中的文件readThisFile.dat size()大于INTEGER.MAX length,因此引发异常

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


3) 有没有比在Java中尝试内存映射文件更快速的解决方案

为什么要创建内存映射缓冲区,然后立即将其内容复制到字节数组?映射缓冲区的全部目的是避免将数据复制到Java数组。即使这样做有效,也比直接读取数组要慢。对于这么大的文件,应该使用流处理。为什么整个文件需要一次加载到内存中?@erickson整个文件不需要一次加载到内存中。如果使用者不调用get()方法,它如何读取文件的内容。流处理,我们仍然在Java 6上,我认为这个流是Java 8 API的一部分,对吗?补充一下:除非你有大量的备用RAM,否则文件不能一次加载到内存中。你需要把它一块一块地装进去instead@JeremyKato我可能理解了,我应该重新表述这一点,但是的,应用程序无法将整个文件读入内存。这就是为什么我在寻找一个不断循环的解决方案。Java是一个糟糕的工具,它无法尝试做你正在做的事情——在编写一个巨大的文件时读取它。Java抽象了操作系统的细节,并通常缓冲IO——这两种情况都会在文件增长时阻碍文件的读取。要从一个不断增长的文件中读取数据,您需要确切地知道在您从中读取数据时它有多大。这是一个特定于操作系统的操作,而Java JVM缓存东西的倾向确实会削弱这一点。这个问题非常相关: