2011-11-22 3 views
2

OutOfMemoryExcetpion in C# ... 주로 BPlus 트리를 기반으로하는 새 인덱스를 만들려고합니다. 색인은 엄청난 양의 데이터 (50 000 000 개 이상의 항목)에 사용되기로되어 있습니다. 색인을 빨리 만들기 위해 내부 트리 노드 (각 노드는 ~ 4KB의 정보, 256 노드 참조)를 RAM에 유지합니다 (자주 액세스합니다). 잎 (가변 크기)은 최대 200MB의 파일로 디스크에 기록됩니다. 파일에서 데이터를 쓰거나 읽기 위해서는
나는 다음과 같은 사용하고 있습니다 :OutOfMemoryException이 C#에서 FileStream에 쓰는 동안

FileStream _FS = new FileStream(FullPath, FileMode.OpenOrCreate); 
... 
byte[] Data = new byte[size]; 
_FS.Read(Data, 0, size); 
... 
_FS.Write(Data, 0, _BlockSize); 

문제는 삽입 항목의 더 많은 수의 (19 000 000)에서 나는에서 OutOfMemoryException을 얻을 수 있다는 것입니다. 나는 나무의 내부 구조 (내부 노드)가 엄청난 양의 메모리를 차지할 수 있다는 것을 이해하지만, 이것이 메모리가 가득한 이유는 아니라고 생각합니다.

하는 나는 다음과 같은 생성자를 사용하고 경우 :

_FS = new FileStream(FullPath, FileMode.OpenOrCreate, FileAccess.ReadWrite, 
FileShare.None, 1024, FileOptions.WriteThrough | Settings.FILE_FLAG_NO_BUFFERING); 

에서 OutOfMemoryException이 (적어도 20 개 000 000 항목에서) 발생하지 않습니다, 그러나, 항목이 삽입되는 속도가 작다. 첫 번째 FileStream 생성자를 사용할 때 .net은 메모리를 채우고 OutOfMemoryException을 발생시키는 내부 버퍼 (RAM)를 사용한다고 생각합니다.

질문은 FileStream (또는 다른 것)을 사용하여 OutOfMemoryException을 발생시키면서 고속으로 항목을 삽입 (디스크에 쓰기) 할 수있는 방법입니까?

+1

예외는 스트림 자체와 관련이 없으므로 코드의 다른 부분을 표시하고 트리를 메모리에 저장/할당하는 방법에 대해 더 자세히 설명해야합니다. –

+0

여기서'size'의 값은 무엇입니까? –

+0

; 당신은 "항목"을 언급합니다 - 파일 당 항목입니까? 또는...? (얼마나 자주'데이터 '가 할당되는지 보려고합니다.) –

답변

2

첫 번째 예제에서는 루프에 _FS.Flush()를 넣으면 10000 개 레코드마다 어떻게됩니까?

관련 문제