2010-11-29 5 views
1

모두 나는 많은 양의 실시간 데이터를 가능한 한 빨리 처리해야합니다.C#의 대용량 메모리 문제

이 데이터는 다중 네트워크 연결 스레드에서 발생합니다.

모든 네트워크 스레드는 데이터를 공유 함수로 전달하여 일부 번역을 진행하고 데이터를 해석하여 해석 한 다음 정보를 객체별로 객체로 동시 사전에 저장합니다.

문제는 내가 abjects이 사전에 저장된 150K 도달 할 수 있습니다.

업데이트 할 개체를 가져 오는 동안 허용 된 시간보다 시간이 오래 걸립니다.

public class MyObject 
{ 
    System.Timers.Timer LostTimer = new System.Timers.Timer(); 
    public int ID; 
    public DateTime UpdateTime; 

    public MyObject() 
    { 
    LostTimer.Interval = 20000; 
    LostTimer.Elapsed+=TimerElapsedHandler(LostTimer_Elapsed); 
    LostTimer.Enabled = true; 
    } 

    void LostTimer_Elapsed(object sender,EventArgs e) 
    { 
    if(UpdateTime > DateTime.Now.AddSeconds(-20)) 
     Console.WriteLine(ID + " Lost..."); 
    } 

} 

public class MyClass 
{ 
    public MyClass(){} 

    private ConcurrentDictionary<int,MyObject> Objects = new ConcurrentDictionary<int,MyObject>(); 

    void NetworkThread1DataRecived(eventArgs e) 
    { 
    Translate(e.Data); 
    } 
    void Translate(string[] data) 
    { 
    Task.Factory.StartNew(()=> 
    { 
     Parallel.ForEach(data, s (()=> 
     { 
     MyObject o = null; 
     Objects.TryGet(int.Parse(s),out o) 
     if(o == null) 
     {  
      o = new MyObject(); 
      o.ID = int.Parse(s); 
      o.UpdateTime = DateTime.Now; 

      Objects.TryAdd(s,o); 
     } 
     else 
     { 
      o.UpdateTime = DateTime.Now; 
     } 
     }); 
    }); 
} 
} 

이제 30,000 개가 넘는 개체로 작업 할 때 개체가 손실됩니다. 제발 내가 급히 도움이 필요합니다

논리는 제가 현재 시스템 시간에서 객체 유예 기간을 빼서 그 객체의 최종 업데이트 시간과 비교한다는 것입니다. 이 유형의 스레드 안전 배열 (사전)이 많은 양의 데이터를 처리 할 수 ​​없어 개체 손실을 유발하는 읽기/쓰기 액세스 지연이 발생한다고 생각하십니까 ??? 전에 List 및 Lock (Object) {}을 사용하여이 공유 메모리에 대한 다중 스레드 액세스를 처리했지만 오브젝트 10K 이후에는 실패합니다. 을 사전 (.Net 빌드를 스레드 안전 목록으로 작성)으로 변경 한 후 30K와 잘 작동합니다. 내 목표는 150K에 도달하는 것입니다.이 논리로 도달하거나 더 좋은 아이디어를 얻을 수 있습니까?

+0

코드가 컴파일되지 않습니다. LHS가 int이고 RHS가 DateTime이므로 'UpdateTime> DateTime.Now.AddSeconds (-20000)'는 유효하지 않습니다. 실제 코드를 볼 수 없다면 문제를 진단하기가 어려울 것입니다. 마찬가지로 Parallel.ForEach에 대한 호출은 구문 적으로 올바르게 보이지 않습니다. –

+0

잘 수정했는데, 게시하는 실수 였으므로 유감스럽게 생각합니다. 코드는 구문 적으로 모두 잘 컴파일되지 않고 논리 오류가 있습니다. 감사합니다 –

+0

논리는 내가 현재 시스템 시간에서 객체 유예 기간을 빼고 그 객체에 대한 마지막 업데이트 시간과 비교한다는 것입니다. 이 유형의 스레드 안전 배열 (사전)이 많은 양의 데이터를 처리 할 수 ​​없어 개체 손실을 유발하는 읽기/쓰기 액세스 지연이 발생한다고 생각하십니까 ??? 전에 List 및 Lock (Object) {}을 사용하여이 공유 메모리에 대한 다중 스레드 액세스를 처리했지만 객체 10K 이후에는 실패합니다. 사전 (.Net 빌드 스레드 안전 목록에)로 변경 한 후 30K로 잘 작동합니다. 내 목표는 150K에 도달하는 것입니다 –

답변

3

따라서 각 개체 (30K 개 개체)를 추가 할 때 타이머를 만듭니다. 30,000 타이머가 작동합니다.

나는 오버 헤드가 많이 발생한다고 생각합니다.

로깅/감사 전용 인 경우 1 타이머에서이를 수행해야합니다. 가능하면 기록 할 개체의 목록/사전을 별도로 작성하십시오.

+0

감사합니다. 저는 각 개체 타이머를 제거하고 이전 타이머 대신 글로벌 타이머를 사용하여 손실을 계산하려고합니다. 그런데 모든 유물은 일정한 유예 기간 내에 온라인 상태 여야합니다. 계속 연락하십시오 ... –

관련 문제