2010-04-27 3 views
0

최대한 빨리 파일에 사전을 저장해야합니다. key와 value는 모두 객체이며 Serializable로 표시되지 않을 수 있습니다. 또한 수천 개의 객체를 직렬화하는 것보다 더 빠른 방법을 선호합니다. 그래서 .NET 4에서 매핑 된 메모리 파일 지원을 살펴 보았습니다. 그러나 MemoryMappedViewAccessor는 참조 유형이 아닌 구조체의 저장 만 허용합니다.C#에서 매핑 된 메모리 파일을 사용하여 참조 유형 저장

파일의 참조 유형에 사용되는 메모리를 저장하고 이진 직렬화없이 해당 메모리에서 객체를 재구성하는 방법이 있습니까?

답변

1

메모리 매핑 된 파일은 근본적으로 가비지 수집기와 호환되지 않습니다. 그래서 .NET과 같은 주요 운영 체제 기능을 지원하는 데 오랜 시간이 걸렸습니다. 참조 유형은 MMF보기 인 MemoryMappedViewStream에 직렬화해야합니다. 관리되지 않는 코드에도 비슷한 제한이 있으며 포인터가있는 개체는 평행하게 배치해야 가리키는 개체가보기에도 표시 될 수 있습니다.

MMF 또는 파일로 serialize하는 경우에도 아무런 차이가 없어도 파일 시스템 캐시는 MMF로 구현됩니다. 기록 된 데이터가 사용 가능한 맵핑 가능 메모리에 맞춰지면 파일 쓰기는 매우입니다. 그게 문제라면 64 비트 운영체제를보고 그 문제를 해결하십시오.

0

이것은 이진 직렬화가 설계된 시나리오 유형입니다. 당신이 그것을 사용하고 싶지 않은 몇 가지 구체적인 이유가 있습니까? '너무 느리다'고 확인 했습니까? 물론, 사용자 정의 serializer를 코딩하여 특정 시나리오에 대해보다 효율적으로 만들 수는 있지만 앞으로 계속 유지해야 할 것입니다. 그만한 가치가 있니?

+0

~ 50 meg의 사전 직렬화는 32 비트 워크 스테이션을 실행하는 dev 워크 스테이션에서 약 70 초가 걸립니다. 그래서 나는 짐작한다 : 네, 그러나 느리게 정의하고 싶습니다 "너무 느린" – Khash

1

메모리를 저장하는 것은 참조 할 수있는 유형이있는 경우 다음에 파일에 액세스 할 때 적용되지 않을 가능성이있는 다른 메모리 블록에 대한 포인터를 갖기 때문에 간단히 작동하지 않을 수 있습니다. 이것이 이진 직렬화가 존재하는 이유입니다. 이러한 종류의 참조를 유지하는 것입니다. 그래도 긴밀한 제어를 원한다면 System.IO.BinaryWriter와 BinaryReader를 사용하여 오버 헤드를 최소화하면서 어떤 순서로 파일에 쓰여지는 것인지 완벽하게 제어 할 수 있습니다.

관련 문제