首先,我构建一个大约12,000个对象的列表(通过读取现有文件),如下所示:
public class Operator
{
string identifier; //i.e "7/1/2017 MN01 Day"
string name1;
string name2;
string id1;
string id2;
}
标识符在列表中是唯一的。
接下来我运行一个大型查询(目前大约有400万行,但可能大到1000万行,大约20列)。然后我使用写入流逐行将所有这些写入CSV。对于每一行,我遍历Operator
列表以查找匹配并添加这些列。
我遇到的问题是性能问题。我希望这份报告需要很长时间才能运行,但我已经确定文件写入步骤花了很长时间(大约4个小时)。我怀疑它与Operator
列表循环400万次有关。
有什么办法可以提高速度吗?也许在我最初构建列表时做某事(可能是索引或排序),这样可以更快地完成搜索。
答案 0 :(得分:3)
你应该能够通过构建一个Dictionary(HashTable)来大大加速你的代码:
var items = list.ToDictionary(i => i.identifier, i => i);
然后您可以在此词典中编入索引:
var item = items["7/1/2017 MN01 Day"];
构建字典是O(n)
操作,对字典进行查找是O(1)
操作。这意味着您的时间复杂度变为线性而非指数。
答案 1 :(得分:0)
...但是,“你不能以某种方式将这些运算符放入数据库表中,这样你就可以在SQL中使用某种JOIN
操作了吗?” < / p>
另一种可能的想法是...... “20个不同的查询,每个符号一个。”或者,UNION
查询有20个分支。如果SQL引擎有任何方式来使用索引,那么为了加快这个过程,你仍然可以领先。
现在,浪费了大量的时间,包装了数百万行中的每一行,通过网络线将它们喷射到您的机器上,只需要丢弃大部分行比方说,因为它们与任何符号都不匹配。
如果您控制数据库并且可以负担空间,并且如果大多数行与任何符号不匹配,请考虑symbols
表和symbols_matched
表,第二个是多对多连接表,用于预先标识哪些行与哪个符号匹配。为了节省时间,这个空间可能是值得的。 (填充此表的过程可以通过适当的插入,更新和删除事件放到存储过程TRIGGERed
中。)
答案 2 :(得分:-1)
很难告诉您如何在不看任何代码的情况下加快文件写入速度。
但总的来说,考虑使用多线程编写可能是值得的。 This SO post有一些有用的信息,你当然可以谷歌了解更多信息。