优化加载到 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 在大字符串上表现不佳,因为它必须多次重新分配临时数组。
这是一道知识问答题。
我们有一个包含 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 在大字符串上表现不佳,因为它必须多次重新分配临时数组。