我有8个文件。它们中的每一个大约是1.7 GB。我将这些文件读入一个字节数组,这个操作已经足够快了。
然后读取每个文件,如下所示:
BufferedReader br=new BufferedReader(new InputStreamReader(new ByteArrayInputStream(data))); 当按顺序使用单个内核进行处理时,大约需要60秒才能完成。然而,当将计算分布在8个独立的核心上时,每个文件所需的时间远远超过60秒。
由于数据都在内存中,并且不执行IO操作,因此我假设每个内核处理单个文件所需的时间不会超过60秒。因此,总共8个文件应该在60秒多一点的时间内完成,但事实并非如此。
我是否遗漏了一些关于BufferedReader行为的信息?或上述代码中使用的任何读取器。
值得一提的是,我首先使用此代码来上传文件:
byte[] content=org.apache.commons.io.FileUtils.readFileToByteArray(new File(filePath));整个代码看起来像这样:
For each file
read the file into a byte[]
add the byte[] to a list
end For
For each item in the list
create a thread and pass a byte[] to it
end For发布于 2013-02-27 21:49:41
你实际上是如何“分配计算”的?是否涉及同步?你只是创建了8个线程来读取这8个文件吗?
您在什么平台上运行(linux、windows等)?我以前在windows调度器中看到过看似奇怪的行为,它将单个进程从一个内核移动到另一个内核,试图在内核之间平衡负载。这最终导致了比仅仅允许单个内核比其他内核更多地被利用更慢的性能。
发布于 2013-02-27 21:52:51
你的系统有多少内存在晃动?
8 x 1.7 to,+操作系统开销,这可能意味着虚拟内存/分页必须发挥作用。这显然比RAM慢得多。
我很欣赏你说每个文件都在内存中,但你是否真的有16 an的空闲RAM,或者在抽象层上有更多的内存?
如果上下文切换也必须不断地切换页面,这将解释增加的时间。
https://stackoverflow.com/questions/15113496
复制相似问题