2013-02-14 2 views
0

SharePoint 2010에서 동의어를 가져 오려고하는데 코드에 다음 문제가 있습니다. 인덱서가없는 keywordCollection을 반복합니다. foreach을 실행하는 것은 너무 오래 걸립니다. 새 키워드를 인스턴스화하는 데 5-10ms 정도 걸리며 지금까지 약 8000 건의 키워드가 있기 때문에 완료하는 데 약 80 초가 걸립니다. 지금까지 시도한 것 :SharePoint 2010에서 foreach 루프가 너무 오래 걸립니다.

  • 이 열거를 얻을 ->뿐만 아니라 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 
     } 
    } 
} 

새로운 object<T>마다 인스턴스화 foreach 문을 사용하지 않고 모음을 반복하는 방법은 무엇입니까?

감사합니다.

+0

"'작업의 // 나머지 여기 ""<---- 이것은 가장 중요한 부분입니다. 루프 안에서 무엇을합니까? 인덱서를 사용하면 어떤 도움이됩니까? – dasblinkenlight

+0

// 작업의 나머지 부분 -> 총 80,000 초에서 총 470ms가 소요되는 일부 문자열 조작. 문제는 foreach가 새로운 읽기 전용 키워드를 생성 할 때마다 10ms가 걸린다고 내 문제입니다. –

+0

그래서 대부분의 키워드를 건너 뛸 수있는 것처럼 보이지 않습니까? 즉, 코드에 컬렉션에있는 각 키워드에 액세스해야하는 것처럼 보입니까? – dasblinkenlight

답변

0

이 시도 :

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 
}); 
+0

내가 한 일과 당신이 한 일간에 차이가 없습니다. 내 문제는 foreach와 함께, 장면 뒤에는 (var keyword = new keyword blabla ....와 같은) 인스턴스화가 키워드 당 10ms처럼 걸리는 것과 같습니다. –

+0

두 번째 방법은 이미 CopyTo를 시도했지만 실패하고 .NET 3.5로 컴파일 된 이후 병렬 라이브러리를 사용할 수 없습니다. 슬프게도 나는 그것에 대처하거나 다른 접근법을 찾아야 할 것이다. –

+0

열거 자 (모든 키워드가 포함 된 해당 컬렉션의 새 인스턴스를 만들어야하기 때문에 CopyTo와 동일해야 함)를 가져 오는 것은 이론적으로 80 초 걸렸습니다. 문자열에 복사 할 수있는 엄청난 양의 시간 [] –

관련 문제