优化点:
- 创建命名类型,并使用 ADO.NET 读取命名类型,而不是使用
DataSet
and DataTable
,这将减少一些内存占用。
- 只提取您实际需要使用的记录(您通常不需要引入超过一百万条记录,但我们不知道您的业务逻辑)
澄清您的原始帖子的问题:
- 你有理由说明这在未来不会扩展吗?
- 你如何处理它,你正在利用它
Parallel.ForEach
?如果底层系统有它的能力,你可能会很好地使用你现在拥有的方法。还要考虑一下,您可能应该分析实际性能,而不是仅仅猜测会发生什么。
DataSet ds = new psqlWork().getDataSet(@"
SELECT * FROM z_sitemap_links
order by timestamp asc /*always order when skipping records so you get the same skips */
LIMIT 100000 /* using these two with variables you could skip so many records /*
OFFSET 100000 /* depending on what you're aiming for */
");
DataTable dt = ds.Tables[0];
Parallel.ForEach(dt.AsEnumerable(), dr =>
{
new Sitemap().runSitemap(dr[1].ToString(), counter);
counter++;
});
而且,如果你可以使用这样的东西:row_number() OVER (ORDER BY col1) AS i
那么你可以跳过计数器,因为当你选择返回的行时会为你提供,但我的 postgres 知识并没有告诉我这是否每次都是 1..100000从上面的代码,或者如果它会是你想要的,但数据库管理员的人肯定会知道。这意味着您的代码将变为:
Parallel.ForEach(recordList, record =>
{
new Sitemap().runSitemap(record.FieldYouNeed, record.RowNumberFromDatabase);
});