【问题标题】:How to iterate and remove elements from hashset most effective way如何从哈希集中迭代和删除元素最有效的方法
【发布时间】:2015-03-17 12:58:11
【问题描述】:

好的,我想出了什么,但我想知道这是最有效的方法。我需要针对 ram 内存问题执行此操作。

HashSet<string> hsLinks = new HashSet<string>();
List<string> lstSortList = new List<string>();

// fill hashset with millions of records

while (true)
{
    string srLastitem = "";
    foreach (var item in hsLinks)
    {
        srLastitem = item;
        break;
    }
    lstSortList.Add(srLastitem);
    hsLinks.Remove(srLastitem);
    if (hsLinks.Count == 0)
        break;
}

c# .net 4.5.2 wpf 应用程序

【问题讨论】:

  • 首先有什么阻止您使用 hsLinks.first() 而不是那个 foreach 循环吗?
  • 你想做什么?

标签: c# .net loops hashset


【解决方案1】:

您似乎正在尝试将项目从 HashSet 移动到 List。如果是这种情况,只需使用List.AddRange 将所有内容移动一次,然后使用HashSet.Clear 清空HashSet

lstSortList.AddRange(hsLinks);
hsLinks.Clear();

如果(如 Vajura 建议的那样)您担心保留 2 个参考文献*,您可以改为批量移动而不是单个项目:

const int batchSize = 1000;
var batch = new string[batchSize];
do
{
    var batchIndex = 0;
    foreach (var link in hsLinks.Take(batchSize))
    {
        batch[batchIndex] = link;
        batchIndex++;
    }

    if (batchIndex < batchSize)
    {
        batch = batch.Take(batchIndex).ToArray();
    }

    hsLinks.ExceptWith(batch);
    lstSortList.AddRange(batch);
} while (hsLinks.Any());

针对您的内存问题使用适当大小的批次。


*注意:引用大小为 4 或 8 个字节(分别在 32 位和 64 位上)。当您将字符串(.Net 中的引用类型)添加到列表时,您不会复制它们,只有引用(大部分可以忽略不计)。

【讨论】:

  • 好吧,这会使调用 Clear() 之前使用的 ram 数量增加一倍,因为这似乎是问题所在?
  • @Vajura 仅当列表中的对象是结构时,如果它们是类,您只会复制不占用太多空间的引用。
  • @Vajura 它会复制引用,这没什么大不了的。但我也在答案中提到了这一点。
  • @Vajura 不,string 不是 .Net 中的结构。
  • @Luaan 8 64 位。 :)
【解决方案2】:

如果您尝试将项目从hsLinks 移动到lstSortList(然后清除hsLinks),您可以在此处使用List&lt;T&gt;.AddRange()

lstSortList.AddRange(hsLinks);
hsLinks.Clear();

【讨论】:

  • ty 但这会在复制之前使内存使用量加倍所以想象一下如果我有 6 GB 内存而 hashset 使用 4 GB 内存:)
  • @MonsterMMORPG 见above answer'scmets 中的讨论
  • @MonsterMMORPG 它不会。它只会复制引用,而不是字符串值 - 每个项目大约 4-8 个字节。由于您使用的是链接(通常比 2-4 个字符长得多),您甚至看不到其中的区别,真的。
猜你喜欢
  • 1970-01-01
  • 2012-08-12
  • 2011-04-28
  • 1970-01-01
  • 2016-01-02
  • 2014-12-02
  • 2012-02-03
  • 2011-03-27
  • 2012-05-13
相关资源
最近更新 更多