0

我有一个包含两列的文件;访问者 ID 和页面 ID。我想找到的是每个页面的唯一/不同访问者的数量。我在 HashTable(dictionary) 中使用 HashTable 来跟踪该特定访问者是否已被计入该特定页面。该文件包含超过 10 亿行,因此性能非常关键。除了 HashTable 中的 HashTable 之外,还有其他数据结构用于计算不同的访问者吗?

我必须在文件上解决这个问题,所以导入数据库不是一种选择。开发环境是.NET,语言是C#。

您可以在下面找到代码:

            Dictionary<int, Dictionary<int, bool>> dicVisitorCount = new Dictionary<int, Dictionary<int, bool>>();
            Dictionary<int, int> dicPages = new Dictionary<int, int>();


            int million = 1000000;

            for (int i = 0; i < 10 * million; i++)
            {

                pageID = r.Next(1, 100000);
                visitorID = r.Next(1, 1000000);


                if (!dicPages.ContainsKey(pageID))
                {
                    dicPages.Add(pageID, 1);

                    Dictionary<int, bool> dicVisitors = new Dictionary<int, bool>();
                    dicVisitors.Add(visitorID, true);
                    dicVisitorCount.Add(pageID, dicVisitors);
                }
                else
                {
                    if (!dicVisitorCount[pageID].ContainsKey(visitorID))
                    {
                        dicVisitorCount[pageID].Add(visitorID, true);
                        dicPages[pageID]++;
                    }
                }
            }
4

1 回答 1

1

作为一个小问题,我更喜欢 a Dictionaryof inttoHashSet而不是 a Dictionaryof intto (这里不需要Dictionarya 的映射功能)。Dictionary

如果您不关心确切的结果,Dictionary也可以考虑int使用布隆过滤器(使用单独的计数来跟踪每个布隆过滤器中有多少元素)。

于 2013-11-11T16:06:18.383 回答