【发布时间】:2022-06-16 00:39:10
【问题描述】:
我的程序有两个主要功能
- 将 URL 源下载到磁盘
- 处理来自磁盘的 URL 源
该列表大约有 200 万个 URL,我可以很好地下载它们,但进程任务在列表的大约 50% 处停止,我也无法调试应用程序,因为它在启动后大约 10 小时停止。
现在我正在批量处理 5k 的列表,然后将结果保存在 txt 文件中。
我正在使用 while 循环和 AsParallel
#我发布完整的空白
private static List<(int id, string url, int rank, int status, int isautohttps, int disk, int db)> not_processed_hosts;
private static void process_hosts()
{
not_processed_hosts = KnownHosts.GetLimitedNotProcessedHosts();
while (not_processed_hosts.Count > 0)
{
// Method 1 - Note: Primary Method
not_processed_hosts.AsParallel().ForAll(host => parseHost((host.id, host.url, host.rank, host.status, host.isautohttps, host.disk, host.db, 0, 0, 0)));
// Method 2
//Parallel.ForEach(not_processed_hosts, host =>{parseHost((host.id, host.url, host.rank, host.status, host.isautohttps, host.disk, host.db, 0, 0, 0));});
save_all();
not_processed_hosts = KnownHosts.GetLimitedNotProcessedHosts();
}
Console.WriteLine("Processing hosts finished");
}
还有其他方法吗?
【问题讨论】:
-
也许使用“旧式调试”:将进度消息写入某个日志文件 - 可能可以让您了解问题。所有网址都有效吗?
-
TPL DataFlow 对您来说可能很有趣。看起来您可以使用一些“管道”行为来控制并行性。这就是 DataFlow 为您提供的。
-
您的
not_processed_hosts源是否一次有 5k 行?你在这个盒子上有多少个处理器?您可以根据核心数量设置WithDegreeOfParallelism以减少影响。 -
但是要在您当前的代码中找到错误,是的。 Hans 说:添加日志记录。
-
请将完整的方法代码与
GetLimitedNotProcessedHosts(包括它们的类型)一起发布,以便我们知道正在使用的方法。