【问题标题】:foreach loop takes too long in SharePoint 2010SharePoint 2010 中的 foreach 循环耗时过长
【发布时间】:2013-01-30 04:33:51
【问题描述】:

我正在尝试从 SharePoint 2010 检索同义词,但我的代码存在以下问题:它循环通过没有索引器的 keywordCollection。执行foreach 花费的时间太长,因为实例化一个新关键字大约持续 5-10 毫秒,到目前为止大约有 8000 个关键字,大约需要 80 秒才能完成。 到目前为止我尝试过的事情:

  • 获取枚举器 -> 也需要 80 秒

  • 将集合转换为列表 -> 未知原因失败。

代码示例:

KeywordContext keywordContext = fastProxy.KeywordContext;
SearchSettingGroupCollection searchSettingGroupCollection = keywordContext.SearchSettingGroups;

foreach (SearchSettingGroup searchSettingGroup in searchSettingGroupCollection)
{
    if (searchSettingGroup.Name == siteId.ToString())
    {
        foreach (Keyword keyword in searchSettingGroup.Keywords)
        {
            //the rest of the work here, per total takes about 470ms
        }
    }
}

有没有办法在不使用foreach 语句的情况下循环遍历集合,该语句每次都会实例化一个新的object<T>

谢谢!

【问题讨论】:

  • "// the rest of the work here"
  • //剩下的工作 -> 只是一些字符串操作,在这 80 秒中总共需要 470 毫秒。问题是每当 foreach 实例化一个新的只读关键字时,它需要大约 10 毫秒,这是我的问题。
  • 所以你不能跳过大部分关键字,对吧?也就是说,您的代码似乎需要访问集合中的每个关键字,对吗?
  • 没错,我需要一种方法来访问该集合中的每个关键字,而无需像“foreach”那样实例化一个新关键字

标签: performance sharepoint collections foreach


【解决方案1】:

试试这个:

using (var site = new SPSite(siteCollectionUrl))
{
    // get the site ID
    var guid = site.ID.ToString();

    // code to get the fastProxy FASTAdminProxy

    KeywordContext keywordContext = fastProxy.KeywordContext;
    var ssgs = keywordContext.SearchSettingGroups;
    if (ssgs.ContainsSearchSettingGroup(guid))
    {
        var searchSettingGroup = ssgs.GetSearchSettingGroup(guid);
        foreach (var keyWord in searchSettingGroup.Keywords)
        {
            // do stuff with keyWord.Synonyms
        }
    }
}

另外,虽然我目前无法测试,但您可以尝试使用 Parallel 类:

using System.Threading.Tasks;

// ...

Keyword[] array = new Keyword[searchSettingGroup.Keywords.Count];
searchSettingGroup.Keywords.CopyTo(array, 0);
Parallel.ForEach<Keyword>(array, keyword =>
{
    //do stuff here
});

【讨论】:

  • 你在那里所做的和我所做的没有区别。我的问题是foreach,在幕后正在做类似(var关键字=新关键字blabla ....)的事情,每个关键字的实例化需要10毫秒。
  • 对于您的第二种方法,我已经尝试过 CopyTo 但它失败了,并且我无法使用并行库,因为它是用 .NET 3.5 编译的。可悲的是,我将不得不处理它或找到另一种方法。
  • 获取枚举器(应该与 CopyTo 相同,因为他们需要创建一个包含所有关键字的集合的新实例)也需要 80 秒,所以理论上,即使它起作用了,将它们复制到字符串中需要相同的大量时间[]
  • 请问,为什么首先需要获取所有同义词?
  • 只是做一些微软在 2010 年放弃的事情,同义词才能正常工作。这实际上是我工作的一部分,所以我只需要
猜你喜欢
  • 2020-05-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-20
  • 2017-11-06
  • 1970-01-01
  • 2015-01-16
  • 1970-01-01
相关资源
最近更新 更多