0

내가 좋아하는 사전에 저장 상당히 복잡하고 중첩 된 (위, 아래 참조 된 개체를 호출 참조) 객체 (클래스)이 프로젝트가 :메모리 맵 파일 또는 직렬화 매우 큰 개체의 속도

public static Dictionary<string, Object1> DObject { get; set; } 

을 Object1은 복잡한 클래스입니다. 그것은 "주소록"또는 "사람 정보"클래스와는 다릅니다. 클래스 자체에는 배열, 다른 객체의 사전이 있습니다. DOUBject의 크기는 메모리에서 1GB +가 될 수 있으므로 BinaryFormatter를 사용하여 파일로 직렬화 할 것입니다. 이 객체를로드해야하기 때문에 MemoryMappedFile을 사용하려고 생각했습니다. 새 키와 값이 사전에 추가 될 수 있습니다. 개체에 더 많은 데이터가있을 수 있습니다 (추가/업데이트 됨). MMF는 크기를 변경합니까? 메모리 매핑 된 파일의 DObject에서 특정 키에 어떻게 액세스합니까? 메모리에 해시 테이블과 같은 검색 메커니즘이있어 사전과 같은 특정 키를 찾아 값을 얻을 수 있습니까? 이 MMF는 어떻게 작동합니까?

이상적인 생각입니다. 디스크에 큰 파일 (2GB 이상)이 있습니다. 디스크에 메모리가 저장된 것처럼 디스크의 사전에있는 개체를 빠르게 업데이트합니다. 모든 것이 빠릅니다. 키 - 값 조회. 조회, 값 수정, 저장 등 ... 원하는 경우 언제든지이 2GB + 개체에 빠르게 액세스해야합니다. WCF 서버가 다시 시작되면이 2GB + 크기 개체에 빠르게 액세스해야합니다. 그래서 내가 1) 직렬화 2)를 생각하고 있었던 것이다. 로드 및 MMF 읽기 /. 나의 주요 관심사는이 순간의 속도 다. 다른 단어로 프로젝트를 디버깅 할 때마다 처음부터이 2GB 데이터를 다시로드 할 수는 없습니다 (시간이 오래 걸립니다).

이 상황을 어떻게 처리해야하는지에 대한 제안, 아이디어 및 의견.

+1

장기간 지속성을 위해 binaryformatter에서 문제가 발생할 수 있습니다 (예 : 네임 스페이스를 변경하면 문제가 빨리 발생합니다). 단기 저장을 위해서는 괜찮을 지 모르지만 메모리 사용에주의해야한다. 문제없이 32 비트 프로세스에서 binaryformatter로 1Gb 그래프를 직렬화 할 수 있다고는 생각하지 않는다. 테이블로의 매핑이 임피던스 문제를 일으킨다 고 생각한다면 RavenDB와 같은 문서 데이터베이스를 고려해 볼 수 있습니다.이 데이터베이스는 전체 문서 그래프를 디스크상의 JSON으로 매핑하고 많은 문제를 처리합니다. –

+0

이들 데이터베이스 중 어떤 것도 객체 그래프 (20 개의 상호 연결된 클래스)를 JSON/BSON으로 구문 분석하고 그 사이에 모든 참조를 유지 한 다음 저장할 수 있습니까? 이게 어떻게 작동합니까? 내 이상적인 생각은 RavenDB 또는 MongoDB에 DObject를 곧장 공급하고 모든 것을 직렬화하고 저장한다는 것입니다. RavenDB에 DObject를 넣으려면 어떤 단계가 필요합니까? 나는 MongoDB를 처음 접했지만 그것에 대해 많이 들었다. – iefpw

+0

RavenDB가 객체를 직접 삼키는 지 아닌지는 객체가 어떻게 구성되어 있는지에 따라 다릅니다. RavenDB는 JSon.NET을 사용하므로 Json.NET을 사용하여 루트 객체를 덤프하고 멀리 떨어져 있는지 확인할 수 있습니다. –

답변

0

메모리 매핑 된 파일에 DObject 자체를 보관할 수 없습니다. .NET 객체는 항상 움직이는 경향이 있으며, 메모리 객체는 메모리의 한 곳에 머물도록 강요 할 수 없습니다 (객체를 고정 할 수는 있지만 실제로는 원하지 않습니다). 객체를 직렬화하고 파일에 쓸 수는 있지만 매번 1GB 이상의 데이터를 쓰는 것이 좋습니다.

왜 표준 방식으로 이동하지 않고 개체를 데이터베이스 테이블 집합으로 '직렬화'하시겠습니까?

+0

어떻게하면됩니까? 객체는 간단한 "개인 정보"또는 "연락처 정보"목록이 아닙니다. 객체 자체에는 키 - 값 쌍 사전이 있습니다. 사전의 값에는 "목록"이 있고 그 목록에는 아마도 "Dictionary "가있을 것입니다. 객체는 외부 객체 등을 참조합니다. 클래스의 간단한 문자열, int, 필드가 있으면 데이터베이스 테이블에 저장합니다.이 값에는 일대 다 연결이 있습니다. 총 20 개의 클래스가이 사전에 포함되어 있습니다. – iefpw

+0

데이터베이스 테이블에서 언급 한 모든 것을 모델링 할 수 있습니다. 약 20 개의 수업이 있으면 약 20 개의 표가 필요합니다. – zmbq

+0

확인. 직렬화 대 데이터베이스 저장소에 대한 논쟁이되고 있다고 생각합니다. 나는 그것이 유효한 논의라고 생각한다. – iefpw