繁体   English   中英

通过多个线程读取文件

[英]Reading a file by multiple threads

我有一个250Mb的文件要读取。 应用程序是多线程的。 如果我允许所有线程读取文件,则会发生内存不足。 我出现内存不足错误。

为了避免它。 我想在内存中只有一个String副本(从流中读取),我希望所有线程都可以使用它。

while (true) {
    synchronized (buffer) {
        num = is.read(buffer);
            String str = new String(buffer, 0, num);

    }
    sendToPC(str);
}

基本上,当所有线程完成发送时,我只希望有一个字符串副本,我想读取第二个字符串,依此类推。

为什么要多线程? 您只有一个磁盘,而且只能运行这么快。 几乎可以肯定,多线程将无济于事。 而且,任何依赖于在内存中存储整个文件的软件设计都首先存在严重缺陷。

假设您定义了问题?

我意识到这有点晚了,但是我想您想在这里使用FileChannel类中的map函数。 将文件的某个区域映射到内存后,所有线程都可以读取或写入该内存块,并且操作系统将定期将该内存区域与文件同步(或在您调用MappedByteBuffer.load()时),并且如果希望每个线程使用文件的不同部分,则可以分配多个映射,每个映射都映射文件的特定区域,并且每个线程仅使用一个映射。

参见javadoc中的FileChannelRandomAccessFileMappedByteBuffer。

您能直接使用流而不是将文件完全读入内存吗?

您可以在文件读取类中将所有线程注册为回调。 因此,具有实现接口StringReaderThread的数组或类列表之类的东西,该接口具有方法processString(String input)。 从文件读取每一行后,遍历此数组/列表,并以此方式在所有线程上调用processString()。 这样可以解决您的问题吗?

暂无
暂无

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

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