2013-02-27 57 views
7

我有8个文件。它们中的每一个大约是1.7GB。我正在将这些文件读入一个字节数组,并且该操作足够快。BufferedReader在多核环境下

每个文件然后读取如下:

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 
+0

分配了多少个磁盘驱动器?或者它们全部存储在同一个驱动器上? – 2013-02-27 13:42:51

+2

对于这样的大文件,我强烈建议使用NIO。 请检查这篇文章:http://www.javalobby.org/java/forums/t17036.html,它可能有帮助 – n1ckolas 2013-02-27 13:44:08

+0

文件在内存中存储在一个字节[]中。磁盘驱动器在这里不相关。 @RJRyV – DotNet 2013-02-27 13:44:29

回答

3

你是如何真正“分配计算“?涉及到同步吗?你只是创建8个线程来读取8个文件?

你在哪个平台上运行(linux,windows等)?我已经看到了Windows调度程序看似奇怪的行为,然后它将一个进程从核心移动到核心,尝试平衡核心之间的负载。这最终导致性能下降,而不仅仅是让一个核心比其他核心利用更多。

+0

对象之间的同步是个问题,谢谢Brett。 – DotNet 2013-02-27 14:54:05

2

您的系统摇摆多少内存?

8 x 1.7GB,+操作系统开销,可能意味着虚拟内存/分页必须发挥作用。这显然比RAM慢得多。

我很感激你说每个文件都在内存中,但是你是否真的拥有16GB的可用内存,还是有更多的内存在抽象级别上?

如果上下文切换也不得不不断切换页面,那可以解释时间增加。

+0

感谢您的回答,我的内存足够容纳数据,不需要分页或使用虚拟内存。 – DotNet 2013-02-27 14:00:54