簡體   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