【发布时间】:2014-01-05 00:53:21
【问题描述】:
我有非常大的文件需要阅读和处理。这可以使用线程并行完成吗?
这是我完成的一些代码。但是,一个接一个地读取和处理文件似乎并没有缩短执行时间。
String[] files = openFileDialog1.FileNames;
Parallel.ForEach(files, f =>
{
readTraceFile(f);
});
private void readTraceFile(String file)
{
StreamReader reader = new StreamReader(file);
String line;
while ((line = reader.ReadLine()) != null)
{
String pattern = "\\s{4,}";
foreach (String trace in Regex.Split(line, pattern))
{
if (trace != String.Empty)
{
String[] details = Regex.Split(trace, "\\s+");
Instruction instruction = new Instruction(details[0],
int.Parse(details[1]),
int.Parse(details[2]));
Console.WriteLine("computing...");
instructions.Add(instruction);
}
}
}
}
【问题讨论】:
-
你是 CPU 密集型还是 IO 密集型?
-
instructions线程安全吗? (答案:没有) -
IO 系统不如你的 CPU 快,所以当涉及到 IO 时使用多线程没有任何好处也就不足为奇了。
-
@user2936347 它可以.. 但前提是您在它在内存中(受 CPU 限制)时对其执行计算。如果您正在等待将大文件加载到内存中(I/O-Bound).. 那么没有。
-
@user2936347,这就是要走的路。您有一个用于 IO 的专用线程(或异步
Task),另一个线程或Task在内容可用时处理它(如果您的处理成为瓶颈,可能并行处理)。经典的生产者-消费者。请参阅并行编程模式 (microsoft.com/en-au/download/details.aspx?id=19222)。第 55 页几乎是完全您的方案。
标签: c# multithreading