2011-04-19 2 views
0

100 개의 다중 속성 개체 목록을 깊이 복제하려고합니다. 아래 코드를 사용하여 딥 복제를 수행하고 있습니다. 목록 작성 및 목록 복제는 루프에서 발생하므로 목록 주위에서 목록이 내용을 변경하지만 100 개의 개체가 고정되어 있습니다.C#의 딥 복제로 각 호출에서 실행 시간이 오래 걸림

문제는 루프를 돌 때마다 목록을 복제 할 때 마지막으로 실행 한 것보다 기하 급수적으로 길어지는 것으로 나타납니다.

public static Main() 
{ 

List<Chromosome<Gene>> population = Population.randomHalfAndHalf(rand, data, 100, opset); 

     for (int i = 0; i < numOfGenerations; i++) 
     { 
        offSpring = epoch.runEpoch(rand, population, SelectionMethod.Tournament, opset); 
        clone = DeepClone<List<Chromosome<Gene>>>(population); 
        clone.AddRange(offSpring); 
        population = fixPopulation(rand, clone, SelectionMethod.Tournament, 100); 
     } 

//....REST OF CODE.... 

} 


public static T DeepClone<T>(T obj) 
    { 
     object result = null; 

     using (var ms = new MemoryStream()) 
     { 
      var formatter = new BinaryFormatter(); 
      formatter.Serialize(ms, obj); 
      ms.Position = 0; 

      result = (T)formatter.Deserialize(ms); 
      ms.Close(); 
     } 
     return (T)result; 
    } 

원래 인구를 덮어 쓸 수 있다면 왜 내가 개체를 복제하는지 생각할 수도 있습니다. 이것은 유효한 시점과 내가 탐험 한 것입니다. 그러나 그렇게 할 때 루프는 완벽하게 8 회 반복 실행됩니다. 처음 실행하면 유휴 상태가되고 아무 것도하지 않아 멈추게됩니다. 다음번에 루프를 돌릴 때마다 9 번의 반복 및 이상, 이상 등은하지 않습니다. 어떤 사람이 왜 이런 일이 일어나고 있는지에 대한 아이디어가 있다면 나는 왜 그런 일이 일어나고 있는지 알지 못한다.

하지만 내 주요 문제는 개체를 복제 할 수있는 시간이 5 분 등까지 다음 결국 처음 몇 초 notablely 이상 위의 루프 주위 때마다 소요입니다

모든 신체 이유에 어떤 아이디어가 이 일이 일어 났나요?

편집 나는 그것이 90 % 이상이 여기에 BinaryFormatter.Deserialize (MemoryStream을) 수행하고되고있는 대부분의 작업을 실행하는 동안 응용 프로그램입니다 프로파일 한 수정 인구는이 문제에 기여할 것 지나치게 복잡 아무것도하지 않고 . 이것

보기 :

당신은 당신의 객체의 빠른 복제를 만들 바이너리 직렬화를 사용할 수 있습니다
private static List<Chromosome<Gene>> fixPopulation(Random rand, List<Chromosome<Gene>> oldPopulation, SelectionMethod selectionMethod, int populationSize) 
    { 
     if (selectionMethod == SelectionMethod.Tournament) 
     { 
      oldPopulation.Sort(); 
     } 
     else 
     { 
      //NSGAII sorting method 
     } 

     oldPopulation.RemoveRange(populationSize, (oldPopulation.Count - populationSize)); 

     for (int i = 0, n = populationSize/2; i < n; i++) 
     { 
      int c1 = rand.Next(populationSize); 
      int c2 = rand.Next(populationSize); 

      // swap two chromosomes 
      Chromosome<Gene> temp = oldPopulation[c1]; 
      oldPopulation[c1] = oldPopulation[c2]; 
      oldPopulation[c2] = temp; 
     } 

     return oldPopulation; 
    } 
+0

'Gene' 개체는 어떻게 생겼을까요? 새끼는'runEpoch'에서 어떻게 생성됩니까? '유전자'는 부모'유전자'에 대한 참조를 보유합니까? 그렇다면 목록에는 100 개의 항목 만 있지만 총 그래프는 반복 될 때마다 커집니다 ... –

+0

디버거가 있습니까? 아마도 단위 테스트를 작성합니까? –

+0

당신은 프로파일 러 (+1) – sehe

답변

0

public Entity Copy() 
     { 
      System.IO.MemoryStream memoryStream = new System.IO.MemoryStream(); 

      System.Runtime.Serialization.Formatters.Binary.BinaryFormatter bFormatter = new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter(); 
      bFormatter.Serialize(memoryStream, this); 
      memoryStream.Seek(0, System.IO.SeekOrigin.Begin); 
      IEntityForm entity= (IEntityForm)bFormatter.Deserialize(memoryStream); 
      return entity; 
     } 

정말 쉬운 일!

+0

나는 memoryStream.Seek을 명시 적으로 지정하고, 코드를 변경하여 문제가 남아 있다는 유일한 차이점이있다. – user648132

+0

무한 루프 또는 스택 오버플로를 확인 했습니까? –

+0

옙 결국 결국 마친 모든 stackoverflows 완화 그것은 절대적으로 그렇게 오래 걸립니다. – user648132

관련 문제