[英]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中的FileChannel , RandomAccessFile和MappedByteBuffer。
您能直接使用流而不是将文件完全读入内存吗?
您可以在文件读取类中将所有线程注册为回调。 因此,具有实现接口StringReaderThread的数组或类列表之类的东西,该接口具有方法processString(String input)。 从文件读取每一行后,遍历此数组/列表,并以此方式在所有线程上调用processString()。 这样可以解决您的问题吗?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.