我有一个250Mb的文件要读。应用程序是多线程的。如果我允许所有线程读取文件,则会发生内存不足。 我的记忆错误。
要避免它。我想在内存中只有一个String(从流中读取)的副本,我希望所有的线程都使用它。
while (true) {
synchronized (buffer) {
num = is.read(buffer);
String str = new String(buffer, 0, num);
}
sendToPC(str);
}
基本上我想在所有线程完成发送时只有一个字符串副本,我想读第二个字符串,依此类推。
答案 0 :(得分:6)
为什么要多线程?你只有一个磁盘,它只能这么快。几乎可以肯定,多线程它无济于事。任何依赖于在内存中存储整个文件的软件设计都是首先存在严重缺陷。
假设您定义了问题?
答案 1 :(得分:2)
我意识到这有点晚了,但我认为你想要的是在FileChannel类中使用map函数。一旦将文件的一个区域映射到内存中,那么所有线程都可以读取或写入该内存块,操作系统将定期将该内存区域与文件同步(或者当您调用MappedByteBuffer.load()时),并且如果您希望每个线程使用文件的不同部分,那么您可以分配多个映射,每个映射映射文件的特定区域,并且每个线程只使用一个映射。
的javadoc答案 2 :(得分:1)
你能直接使用流而不是将文件完全读入内存吗?
答案 3 :(得分:1)
您可以在File读取类中将所有线程注册为回调。 SO有类似于实现接口StringReaderThread的类的数组或列表,其接口方法为processString(String input)。从文件中读取每一行后,遍历此数组/列表并以这种方式在所有线程上调用processString()。这会解决你的问题吗?