繁体   English   中英

如何在没有被阻止的情况下以块的形式读取Java中的大文件?

[英]How to read huge file in Java, in chunks without being blocked?

假设你有一个更大的文件然后你有内存来处理。 您希望轮流读取n个字节的文件, 并且不会在此过程中被阻止

  • 读一个街区
  • 将它传递给一个线程
  • 读另一个街区
  • 将它传递给一个线程

我尝试了不同的事情并取得了不同的成功,但阻塞似乎总是存在问题。

请提供一个获取访问权限的非阻塞方式示例,例如byte[]

你不能。

在等待磁盘为您提供数据时,您将始终阻止。 如果您对每个数据块有很多工作要做,那么使用第二个线程可能有所帮助:该线程可以对数据执行CPU密集型工作,而第一个线程被阻塞,等待下一次读取完成。

但这听起来不像你的情况。

您最好的选择是尽可能大地读取数据(例如,1MB或更多)。 这最小化了内核中阻塞的时间,并且可能导致等待磁盘的时间更少(如果正在读取的块恰好是连续的)。


这是代码

ExecutorService exec = Executors.newFixedThreadPool(1);

// use RandomAccessFile because it supports readFully()
RandomAccessFile in = new RandomAccessFile("myfile.dat", "r");
in.seek(0L);

while (in.getFilePointer() < in.length())
{
    int readSize = (int)Math.min(1000000, in.length() - in.getFilePointer());
    final byte[] data = new byte[readSize];
    in.readFully(data);
    exec.execute(new Runnable() 
    {
        public void run() 
        {
            // do something with data
        }
    });
}

听起来你正在寻找Streams,缓冲或两者的某种组合(BufferedInputStream任何人?)。

看看这个: http//docs.oracle.com/javase/tutorial/essential/io/buffers.html

这是处理非常大的文件的标准方法。 如果这不是你想要的,我道歉,但希望无论如何它都会帮助让人流淌。

祝好运!

如果你有一个执行I / O和CPU计算的程序,如果平均处理一个字节所花费的CPU时间少于读取一个字节的时间,则阻塞是不可避免的(程序中的某个地方)。

如果您尝试读取文件并且需要磁盘搜索,则数据可能不会达到10毫秒。 在这段时间内,2 GHz CPU可以完成20 M个时钟周期的工作。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM