【发布时间】:2015-11-18 16:03:16
【问题描述】:
我有 8 个核心系统,我正在处理包含数百万行的文本文件,例如 23 个文件包含大量行,需要 2 到 3 个小时才能完成。我正在考虑使用 TPL 任务来处理文本文件。截至目前,我正在使用的代码是一个接一个地顺序处理文本文件,所以我正在考虑将它拆分为一个线程中的 5 个文本文件,另一个线程中的 5 个等。这是一个好方法还是任何其他方式?我正在使用.net 4.0,我使用的代码如下所示
foreach (DataRow dtr in ds.Tables["test"].Rows)
{
string filename = dtr["ID"].ToString() + "_cfg";
try
{
foreach (var file in
Directory.EnumerateFiles(Path.GetDirectoryName(dtr["FILE_PATH"].ToString()), "*.txt"))
{
id = file.Split('\\').Last();
if (!id.Contains("GMML"))
{
strbsc = id.Split('_');
id = strbsc[0];
}
else
{
strbsc = file.Split('-');
id = ("RC" + strbsc[1]).Replace("SC", "");
}
ProcessFile(file, id, dtr["CODE"].ToString(), dtr["DOR_CODE"].ToString(), dtr["FILE_ID"].ToString());
}
}
如何将文本文件拆分成批次,每个批次应该在线程中运行,而不是一个一个地运行。假设如果 23 个文件,那么 7 个在一个线程中 7 个在一个线程中,7 个在一个线程中,2 个在另一个线程中。另一件事是我将所有这些数据从文本文件移动到 oracle 数据库
编辑
如果我这样使用会值得,但是如何将文件分成批次
Task.Factory.StartNew(() => {ProcessFile(file, id, dtr["CODE"].ToString(), dtr["DOR_CODE"].ToString(), dtr["FILE_ID"].ToString()); });
【问题讨论】:
-
你的代码瓶颈在哪里?如果它“运行缓慢”,您需要衡量这种缓慢来自何处。是因为CPU使用率,还是因为IO?如果是后者,多线程不会帮助您,并且(很可能)会使事情变慢。你需要确定。
-
您的单线程方法是否最大限度地利用了单核?如果不是,那么 IO 很可能是瓶颈,而在多个线程上执行相同操作的简单方法不太可能产生您想要的性能提升。
-
@peter 您没有提供足够的信息来启用回复。正如 spender 所问的那样,您需要在做出不知情的更改之前确定瓶颈在哪里。您没有指定 ProcessFile 的作用,但如果它是一段效率低下的代码,那么 Threading 会使情况变得更糟。如果 ProcessFile 正在执行读取和写入操作,并且已经破坏了磁盘,那么您将使其变得更糟。您需要在更改之前确定瓶颈所在。
-
@spender 我回答了我的问题
标签: c# multithreading .net-4.0 task-parallel-library