这是一个开放的知识问题。
我们有一个包含800.000个字符串的文件(当前为CSV)。 我们在使用string.split加载后解析此文件。 然后我们将字符串[]放入哈希表中。
我们必须使用散列表,因为我们希望在不到半秒的时间内在散列表中找到特定的字符串(看起来像自动纠正建议单词一样快,我开始输入它们,几乎在每次击键后立即)。 / p>
整个过程必须在本地和平板电脑或手机上运行。这个过程需要很长时间。
我们有什么方法可以优化当前流程?或者我们可以更改输入文件(比如,在文件中以某种方式而不是CSV中准备好哈希表),以便在加载时可以直接将其放回内存中吗?
非常感谢任何关于加快这一过程的建议。
先谢谢你, 笑脸
答案 0 :(得分:1)
平面文件没有被用于某个原因 - 处理它们最多是线性的(你的情况更糟,因为你全部读了它们,然后拆分每一个(最坏的时候已经是O(n ^ 2)),然后对它们进行排序(另一个O(nlogn))以插入哈希表。
使用DBMS,比如Sqlite更好,他们直接存储哈希表,并且能够立即进行二进制搜索(如果正确编入索引),无需设置成本即可查找O(logn) 。创建数据库文件时已支付该费用。
答案 1 :(得分:0)
已经有c#库可以帮助您,而无需担心优化问题
你可以试试: http://www.codeproject.com/Articles/9258/A-Fast-CSV-ReaderRead的语法示例:
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在大字符串上表现不佳,因为它必须多次重新分配临时数组。