문제

응용 프로그램에서 "저장"기능에 직렬화를 사용하고 있습니다. 그러나 데이터가 너무 커지면 (15+ MB) 제외 예외가 발생하기 시작합니다.

나는 너무 많은 객체가 있고 다른 작은 물체와 연결되어 있습니다. 이것이 너무 많은 처리 능력과 메모리에 보관 된 데이터를 유발한다고 생각합니다.

내 코드는 거의 동일합니다.

http://www.codeproject.com/kb/vb/treeviewdataaccess.aspx

편집하다 :

  1. 사용자 정의 직렬화를 사용하지 않으며 [Serialization] 속성에 의해 수행됩니다. 일부 필드 제외.

  2. 너무 많은 객체와 사용자 정의 클래스를 연속화합니다. 사전, 구조 및 기타 여러 가지를 포함합니다.

  3. 파일로 직렬화합니다.

  4. xmlserializer를 사용합니다

추신 : 4GB의 물리적 메모리가 있습니다.

해결책

답변 덕분에 내 문제는 XMLSerializer와 함께있는 것으로 밝혀졌으며 제거했습니다. 이진 직렬화는 내가 가진 데이터에서 잘 작동합니다.

도움이 되었습니까?

해결책

15MB는 당신에게 oom을주지 않아야합니다.

데이터가 트리와 같은 경우 (전체 그래프 대신)와 같은 시리얼 라이저를 고려할 수 있습니다. protobuf-net; Google의 매우 효율적인 (속도 및 메모리) 바이너리 "프로토콜 버퍼"형식을 사용하는 것뿐만 아니라 참조 추적 (그래프에 필요한)을 수행 할 필요가 없습니다. 버퍼링하려면).

그러나 이것은 클래스마다 다른 마크 업이 필요합니다 (또는 적어도 "opt in") - 전체 그래프를 처리하지 않습니다. 그러나 거기에 있고 무료 ...

다른 팁

나는 정확히 같은 문제가있었습니다. 그 이유는 .NET 직렬화가 확장되지 않기 때문입니다.

Simon Hewitt의 우수한 오픈 소스 라이브러리를 사용하여 문제를 해결했습니다. .NET -Part 2에서 직렬화 최적화.

메모리 사용량을 크게 줄이는 것 외에도 훨씬 빠릅니다. 기사와 비슷하게 20 번의 속도를 높였습니다.

실제로 XmlSerializer는 SerializableAttribute 속성을 무시합니다. 그들은 서식 클래스 (Binaryformatter, soapformatter)에 의해서만 사용됩니다.

XMLSerializer를 사용하여 직렬화하지 않으며 특히 XMLSerializer와 Binaryformatter의 조합은 아닙니다.

Binaryformatter를 사용하여 모든 것을 직렬화하려고합니다.

직렬화 루틴을 작성하고 직렬화 프로세스를 손으로 꼬리서 성능 이점을 얻을 수 있는지 확인할 수 있습니다. 자세한 내용은 사용자 지정 직렬화에 대한 MSDN 페이지.

어쩌면 직렬화 방법에 대한 자세한 내용을 알려줄 수 있습니다. 사용자 정의 직렬화를 사용하십니까? 아니면 내장 된 [직렬화] 속성 만 사용합니까?

나는 당신이 이것을 처리 할 수있는 좋은 방법은 사용자 정의 직렬화 로직을 수행하고 필요한 것만 직렬화하는 것입니다. 4GB로 갈 수는 없습니다.

여기에 언급 된 모든 접근법이 있으면 큰 물체를 디스크에 덤프하고 복구하는 용이성이 손실됩니다. 또한 이러한 지원은 데이터 유형 만 덤프하므로 Binaryformatter를 사용하면 참조 유형을 쉽게 덤프 할 수 없습니다.

또한 압축을 사용합니다 gzip 또는 7-zip 큰 물체의 이진 형식 전에 실제로 16MB 이상의 크기를 32MB와 같은 것으로 이동시킵니다.

다운로드 할 수 있습니다 json.net 내 프로젝트에서 100MB 이상의 데이터의 직렬화 및 사막화가 작동하는 라이브러리.

직렬화를 위해 작업 할 수 있습니다

객체가있는 경우 TextWriter를 사용하십시오

using (TextWriter textWriter = File.CreateText("LocalJsonFile.json"))
{
    var serializer = new JsonSerializer();
    serializer.Serialize(textWriter , yourObject);
}

문자열이있는 경우 StringWriter를 사용하십시오

  StringBuilder sb = new StringBuilder();
  StringWriter sw = new StringWriter(sb);

  using(JsonWriter textWriter = new JsonTextWriter(sw))
  {
     var serializer = new JsonSerializer();
     serializer.Serialize(textWriter, yourObject);
  }

이것은 당신을 위해 효과가있을 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top