c# - C# - 提高搜索时的性能
问题描述
我在 txt 文件中有一个包含 15000000 个用户名的列表,我编写了一个方法来创建大脑钱包,检查是否有任何地址包含 600 个地址的列表。差不多就是这样
private static List<string> userList = new List<string>(File.ReadAllLines(@"C:\Users\Erik\Desktop\InfernoUser-workspace-db.txt"));
private static List<string> enterpriseUserList = new List<string>(File.ReadAllLines(@"C:\Users\Erik\Desktop\InfernoEnterpriseUser-local-db.txt"));
foreach (var i in userList)
{
userid = ToAddress(i);
if (enterpriseUserList.Contains(userid))
Console.WriteLine(i,userid);
{
private string ToAddress(string username)
{
string bitcoinAddress = BitcoinAddress.GetBitcoinAdressEncodedStringFromPublicKey(new PrivateKey(Globals.ProdDumpKeyVersion, new SHA256Managed().ComputeHash(UTF8Encoding.UTF8.GetBytes(username), 0, UTF8Encoding.UTF8.GetBytes(username).Length), false).PublicKey);
}
ToAddrsess 方法将用户名哈希为 SHA256 字符串,获取其公钥并将其转换为如下地址:
15hDBtLpQfcbrrAFupWjgN5ieHeEBd8mbu
这段代码很糟糕,运行速度很慢,每秒处理大约 200 行数据。所以我尝试使用多线程来改进它
private static void CheckAddress(string username)
{
var userid = ToAddress(username);
if (enterpriseUserList.Contains(userid))
{
Console.WriteLine(i,userid);
}
}
private static void Parallel()
{
List<string> items = new List<string>(File.ReadLines(@"C:\Users\Erik\Desktop\InfernoUser-workspace-db.txt"));
ParallelOptions check = new ParallelOptions() { MaxDegreeOfParallelism = 100 };
Parallel.ForEach<string>(items, check, line =>
{
CheckAddress(line);
});
}
它没有多大帮助。有人可以建议如何即兴创作吗?与在 CPU 上运行的 vanitygen 相比,它每秒可以处理 4-500k 地址。怎么会有这么大的不同?
解决方案
您可以尝试使用带有 key=userid 的 Dictionary,以防止每次迭代都按列表搜索
var dict = new ConcurrentDictionary<string, string>(100, userList.Count);
userList.AsParallel().ForAll(item =>
{
dict.AddOrUpdate(ToAddress(item), item, (key,value)=>{return value;});
});
enterpriseUserList.AsParallel().ForAll(x =>
{
if (dict.ContainsKey(x))
{ Console.WriteLine(dict[x]); }
});
推荐阅读
- symfony - 在链配置的命名空间中找不到类 xx
- html - 如何仅在双击时打开fancybox3?
- vb.net - 正在寻找连接到服务器并清除打印机打印队列的脚本?
- react-native - hashkey不匹配错误android faebook应用程序
- c# - 在 C# 中获取进程信息的权限
- julia - 如何从正在运行的会话中恢复 Julia 历史文件?
- sql - 在 ON 条件下加入多个案例的两个表
- reactjs - react-sortablejs - 列表不会更新,组件不会重新渲染
- javascript - 异步函数给我 _40: 0, _65: 0, _55: null, _72: null
- jupyter-notebook - 使用 iplantuml 库从文本文件描述生成植物序列图