快速搜索大型对象列表

时间:2017-07-31 17:55:58

标签: c#

首先,我构建一个大约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万次有关。

有什么办法可以提高速度吗?也许在我最初构建列表时做某事(可能是索引或排序),这样可以更快地完成搜索。

3 个答案:

答案 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有一些有用的信息,你当然可以谷歌了解更多信息。