优化加载到 C# 中的哈希表

Optimized loading to a hashtable in C#

这是一道知识问答题。

我们有一个包含 800.000 个字符串的文件(当前为 CSV)。 我们用 string.split 加载后解析这个文件。 然后我们将该字符串[]放入哈希表中。

我们必须使用哈希表,因为我们想在不到半秒的时间内在哈希表中找到特定的字符串(就像我开始输入时一样快地自动更正建议单词,每次击键后几乎立即) .

整个过程必须 运行 在本地和平板电脑或 phone 上进行。这个过程花费的时间太长了。

我们有什么办法可以优化当前的流程吗?或者我们可以更改输入文件(例如,以某种方式在文件中准备好哈希表而不是 CSV)以便它可以在加载时直接将其放回内存中吗?

任何以任何方式加速此过程的建议都将不胜感激。

提前致谢, 笑脸

不使用平面文件是有原因的——处理它们充其量是线性的(你的情况更糟,因为你阅读了所有文件,然后拆分每个文件(最坏情况下已经是 O(n^2)),然后对它们进行排序(另一个 O(nlogn))以插入散列 table.

使用 DBMS 会更好,比如 Sqlite,它们直接存储散列 table 并且能够立即进行二进制搜索(如果索引正确),使查找 O(logn)没有设置成本。该费用已在您创建数据库文件时支付。

已经有 c# 库可以为您完成这些工作,您无需担心优化方面的问题

你可以试试: http://www.codeproject.com/Articles/9258/A-Fast-CSV-Reader

Read 的语法示例:

void ReadCsv()
{
    // open the file "data.csv" which is a CSV file with headers
    using (CsvReader csv =
           new CsvReader(new StreamReader("data.csv"), true))
    {
        int fieldCount = csv.FieldCount;

        string[] headers = csv.GetFieldHeaders();
        while (csv.ReadNextRecord())
        {
            for (int i = 0; i < fieldCount; i++)
                Console.Write(string.Format("{0} = {1};",
                              headers[i], csv[i]));
            Console.WriteLine();
        }
    }
}

站在巨人的肩膀上,才能看得更远

您必须逐行读取输入的 csv 并将每一行立即存储到 hastable 中。 String.Split 在大字符串上表现不佳,因为它必须多次重新分配临时数组。