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

时间:2015-04-24 13:09:09

标签: c# mobile hashtable

这是一个开放的知识问题。

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

我们必须使用散列表,因为我们希望在不到半秒的时间内在散列表中找到特定的字符串(看起来像自动纠正建议单词一样快,我开始输入它们,几乎在每次击键后立即)。 / p>

整个过程必须在本地和平板电脑或手机上运行。这个过程需要很长时间。

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

非常感谢任何关于加快这一过程的建议。

先谢谢你, 笑脸

3 个答案:

答案 0 :(得分:1)

平面文件没有被用于某个原因 - 处理它们最多是线性的(你的情况更糟,因为你全部读了它们,然后拆分每一个(最坏的时候已经是O(n ^ 2)),然后对它们进行排序(另一个O(nlogn))以插入哈希表。

使用DBMS,比如Sqlite更好,他们直接存储哈希表,并且能够立即进行二进制搜索(如果正确编入索引),无需设置成本即可查找O(logn) 。创建数据库文件时已支付该费用。

答案 1 :(得分:0)

已经有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();
        }
    }
}

你可以站在巨人的肩膀上看得更远。

答案 2 :(得分:0)

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