我正在尝试解决 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中尝试内存映射文件以外的东西?