【发布时间】:2011-09-06 00:02:18
【问题描述】:
最近,我在 MATLAB 程序中实现了并行化,这与 Slow xlsread in MATLAB 中提供的建议非常相似。然而,实现并行性却出现了另一个问题 - 处理时间随着规模的增加而非线性增加。
罪魁祸首似乎是java.util.concurrent.LinkedBlockingQueue 方法,从附加的分析器图像和相应的压缩图中可以看出。
问题:我如何消除这种非线性,因为我的工作涉及单次运行处理 1000 多张纸 - 这需要非常长的时间?
注意:程序的并行化部分只涉及读取所有.xls 文件并将它们存储在矩阵中,然后我开始我的程序的其余部分。 dlmwrite 在程序结束时使用,它的时间优化并不是真正需要的,尽管也可以建议。
罪魁祸首:
正在并行化的代码:
parfor i = 1:runs
sin = 'Sheet';
sno = num2str(i);
sna = strcat(sin, sno);
data(i, :, :) = xlsread('Processes.xls', sna, '' , 'basic');
end
【问题讨论】:
-
LinkedBlockingQueue是一个类,而不是一个方法。是一直用完的take方法吗?如何创建队列? -
我在上面添加了更多细节。罪魁祸首是 q.poll 语句。我的直觉表明,这可能是由于并发访问 excel 文件时出现阻塞而发生的 - 但不知道,我可能完全偏离目标。
-
是的,Excel 文件阅读器很可能本身就是单线程的,因此您一次只能从一个线程中读取文件。但是,这并不能解释为什么
poll函数一直在占用时间。 -
但是 - 如果 xlsread 是单线程的,那么至少它会在从多个工作表文件中读取单个工作表时表现出恒定的性能。另一种理论说,程序在查看具有大量工作表的文件时会感到害怕。 :D
-
我仔细查看了您的表,似乎争用不是问题——您的程序大部分时间都在等待条目入队,而不是争夺访问队列的锁.也许你有一些非线性处理算法。
标签: performance matlab file-io parallel-processing