繁体   English   中英

基于同一行中的另一个变量来对一组进行不同计数的最快方法(页面访问者的不同计数)

[英]Fastest way to distinct count a group based on another variable in the same line(distinct count of visitors to a page)

我有一个包含两列的文件; visitorId和pageID。 我想找到的是每个页面的唯一身份/独立访客数。 我在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]++;
                    }
                }
            }

作为一个小问题,我宁愿一个DictionaryintHashSet ,而不是一个DictionaryintDictionary (一的映射功能Dictionary是没有必要在这里)。

如果您不关心确切的结果,则还可以考虑使用一个“ intbloom过滤器Dictionary ”(使用单独的计数来跟踪每个bloom过滤器中有多少个元素)。

组列表<object>带有键和不同值的计数<div id="text_translate"><p>我正在尝试提出一个解决方案来对给定的键和值列表进行分组。</p><p> 我需要像这样对它进行分组:Key &gt; Dicttinct Value &gt; Count。</p><p> 例如</p><pre>XFN99 2 3 &lt;= [CODE] [DISTINCT_VALUE] [OCCURANCE IN LIST]</pre><p> 我有一个返回List&lt;ObjectPart&gt;的方法。 此 object 具有public string code和public int value 。</p><p> 我需要获取键中每个不同值的计数。</p><p> 示例输入:</p><pre> XFN999 2 XFN999 2 XFN999 2 XFN999 4 XFN999 8 XFN999 8 XFN999 8 BPN655 1 BPN675 2 BPN655 1</pre><p> 所需的 Output:</p><pre> XFN999 2 =&gt; 3x XFN999 4 =&gt; 1x XFN999 8 =&gt; 3x BPN655 1 =&gt; 2x BPN675 2 =&gt; 1x</pre><p> 我试图 LINQ 以我的方式成功但失败了,因为它对每个键的值求和。</p><pre> var distValsPerKey = S.getAllDiffs().Result.GroupBy(x =&gt; x.code).Select(x =&gt; new { C_ = x.Key, V_ = x.Distinct().Count() });</pre><p> Output 与我的解决方案:</p><pre> BPN373 =&gt; 30 BPN374 =&gt; 35 BPN377 =&gt; 47 BPN378 =&gt; 43 BPN387 =&gt; 67 BPN388 =&gt; 49 BPN653 =&gt; 10 BPN654 =&gt; 15 BPN699 =&gt; 40 BPN700 =&gt; 45 BPN711 =&gt; 68 BPN723 =&gt; 13 BPN724 =&gt; 11 BPN853 =&gt; 5 BPN854 =&gt; 6 BPN877 =&gt; 99 BPN878 =&gt; 94 BPN505 =&gt; 92 BPN507 =&gt; 570 BPN508 =&gt; 617</pre><p> 我的解决方案基本上对 key 的值求和,但<strong>我需要对每个 key 的不同值求和/计数</strong>。</p><p> 下面的例子:</p><p> <strong>Getting input of List&lt;ObjectPart&gt;</strong></p><pre> public async Task&lt;List&lt;ObjectPart&gt;&gt; getAllDiffs() { List&lt;ObjectPart&gt; TEMP = new List&lt;ObjectPart&gt;(); await Task.Run(() =&gt; { using (IngresConnection CONN = new IngresConnection()) { string QUERRY = SELECT_REDACTED; try { using (IngresCommand CMD = new IngresCommand()) { CONN.ConnectionString = "host=; userID=; pwd=; database=;"; CMD.Connection = CONN; CMD.CommandText = QUERRY; CONN.Open(); using (IngresDataReader READ = CMD.ExecuteReader()) { while (READ.Read()) { ObjectPart OP = new ObjectPart(); OP.wenr = READ.GetValue(0).ToString().Trim(); OP.difference = Convert.ToInt32(READ.GetInt32(1)); TEMP.Add(OP); } READ.Close(); CONN.Close(); } } } catch (Exception E) { CONN.Close(); CONN.Dispose(); } } }); List&lt;ObjectPart&gt; OPS_SORTED = TEMP.OrderBy(m =&gt; m.code).ToList(); return OPS_SORTED; }'</pre><p> <strong>LINQ the input to get desired output</strong></p><pre> var distValsPerKey = S.getAllDiffs().Result.GroupBy(x =&gt; x.code).Select(x =&gt; new { C_ = x.Key, V_ = x.Distinct().Count() }); foreach(var OP in distValsPerKey) { Console.WriteLine($"{OP.C_} = &gt; {OP.V_}"); }</pre></div></object>

[英]Group List<Object> with keys and distinct values count

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 计算数组中不同元素数量的最快方法 C# 数据表按计数和不同分组 使用GROUP BY和COUNT(DISTINCT)的LINQ to SQL 组列表<object>带有键和不同值的计数<div id="text_translate"><p>我正在尝试提出一个解决方案来对给定的键和值列表进行分组。</p><p> 我需要像这样对它进行分组:Key &gt; Dicttinct Value &gt; Count。</p><p> 例如</p><pre>XFN99 2 3 &lt;= [CODE] [DISTINCT_VALUE] [OCCURANCE IN LIST]</pre><p> 我有一个返回List&lt;ObjectPart&gt;的方法。 此 object 具有public string code和public int value 。</p><p> 我需要获取键中每个不同值的计数。</p><p> 示例输入:</p><pre> XFN999 2 XFN999 2 XFN999 2 XFN999 4 XFN999 8 XFN999 8 XFN999 8 BPN655 1 BPN675 2 BPN655 1</pre><p> 所需的 Output:</p><pre> XFN999 2 =&gt; 3x XFN999 4 =&gt; 1x XFN999 8 =&gt; 3x BPN655 1 =&gt; 2x BPN675 2 =&gt; 1x</pre><p> 我试图 LINQ 以我的方式成功但失败了,因为它对每个键的值求和。</p><pre> var distValsPerKey = S.getAllDiffs().Result.GroupBy(x =&gt; x.code).Select(x =&gt; new { C_ = x.Key, V_ = x.Distinct().Count() });</pre><p> Output 与我的解决方案:</p><pre> BPN373 =&gt; 30 BPN374 =&gt; 35 BPN377 =&gt; 47 BPN378 =&gt; 43 BPN387 =&gt; 67 BPN388 =&gt; 49 BPN653 =&gt; 10 BPN654 =&gt; 15 BPN699 =&gt; 40 BPN700 =&gt; 45 BPN711 =&gt; 68 BPN723 =&gt; 13 BPN724 =&gt; 11 BPN853 =&gt; 5 BPN854 =&gt; 6 BPN877 =&gt; 99 BPN878 =&gt; 94 BPN505 =&gt; 92 BPN507 =&gt; 570 BPN508 =&gt; 617</pre><p> 我的解决方案基本上对 key 的值求和,但<strong>我需要对每个 key 的不同值求和/计数</strong>。</p><p> 下面的例子:</p><p> <strong>Getting input of List&lt;ObjectPart&gt;</strong></p><pre> public async Task&lt;List&lt;ObjectPart&gt;&gt; getAllDiffs() { List&lt;ObjectPart&gt; TEMP = new List&lt;ObjectPart&gt;(); await Task.Run(() =&gt; { using (IngresConnection CONN = new IngresConnection()) { string QUERRY = SELECT_REDACTED; try { using (IngresCommand CMD = new IngresCommand()) { CONN.ConnectionString = "host=; userID=; pwd=; database=;"; CMD.Connection = CONN; CMD.CommandText = QUERRY; CONN.Open(); using (IngresDataReader READ = CMD.ExecuteReader()) { while (READ.Read()) { ObjectPart OP = new ObjectPart(); OP.wenr = READ.GetValue(0).ToString().Trim(); OP.difference = Convert.ToInt32(READ.GetInt32(1)); TEMP.Add(OP); } READ.Close(); CONN.Close(); } } } catch (Exception E) { CONN.Close(); CONN.Dispose(); } } }); List&lt;ObjectPart&gt; OPS_SORTED = TEMP.OrderBy(m =&gt; m.code).ToList(); return OPS_SORTED; }'</pre><p> <strong>LINQ the input to get desired output</strong></p><pre> var distValsPerKey = S.getAllDiffs().Result.GroupBy(x =&gt; x.code).Select(x =&gt; new { C_ = x.Key, V_ = x.Distinct().Count() }); foreach(var OP in distValsPerKey) { Console.WriteLine($"{OP.C_} = &gt; {OP.V_}"); }</pre></div></object> 尽管计数工作正常,但与组的不同计数失败 LINQ查询具有不同的计数 Linq的独特数量 Linq 不同 - 计数 Linq独特计数 基于两个属性从列表中选择不同值的最快方法
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM