首页 > 解决方案 > 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 地址。怎么会有这么大的不同?

标签: c#multithreadingperformancecryptographytext-files

解决方案


您可以尝试使用带有 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]); }
        });

推荐阅读