2009-11-13 5 views
2

약 30   KB의 데이터를 직렬화하려고하는데 데이터를 직렬화하고 비 직렬화하는 더 빠른 방법을 찾아야합니다. 나를 위해 속도가 크기만큼 중요하므로 데이터를보다 단단히 압축 할 수있는 방법을 찾거나 개체를 만드는 데 더 빠른 메커니즘이 필요합니다. 내장 직렬화 메서드를 사용할뿐만 아니라 일부 사용자 지정 메서드를 작성하려고했지만 거기에있는 누군가가이 기능에 대한 경험이 있기를 바랍니다..NET에서 가장 빠른 serialization 방법은 무엇입니까?

내 응용 프로그램에서는 밀리 초를 계산하므로 일부 개체가 상당히 클 수 있기 때문에 속도가 크기와 비교할 때 특히 좋습니다.

EDIT

데이터는 사전 및 문자열의 int 및 다수의 필드를 포함하여 그것에 다양한 특성을 가진 객체이다. 복잡한 메쉬를 가정합니다.

그래서이 예제를 만들었습니다.이 예제는 객체의 관계가 어떻게 생겼는지에 대해 약간의 아이디어를 제공합니다.

<Serializable()> Class A 
    Inherits B 
    Dim _C As New C 
    Dim E As Byte() 
End Class 
<Serializable()> Class B 
    Dim A As Int32 
    Dim B As Dictionary(Of String, Object) 
End Class 
<Serializable()> Class C 
    Dim A As Int32 
    Dim D As String 
End Class 

물론 필드에 접근 자도 있지만 여기에는 영향을 미치지 않습니다.

+0

자세히 알려주십시오. 예는 항상 유용하다. –

답변

0

답변은 직렬화 할 데이터의 종류와 구조에 근본적으로 달려 있습니다.

데이터가 30K의 바이트 배열 인 경우 전체 블록을 하나의 블록으로 이진 스트림에 기록하면 훨씬 빠르게 처리 할 수 ​​없습니다.

데이터가 상호 연결의 메쉬에 임베드 된 고도로 구조화 된 개체의 30K 메시 인 경우 ... - 행운을 빈다.

0

Marc Gravell의 블로그에 protobuf-net vs NetDataContractSerializer의 흥미로운 벤치 마크가 있습니다.

유용한 답을 원한다면 어쨌든 데이터 구조에 대한 자세한 정보를 제공해야합니다.

2

마음에 떠오르는 몇 가지 사항이 있습니다.

직렬화되는 데이터의 양을 줄일 수 있습니까? 이것은 막 다른 골목 일지 모르지만 성능에 큰 영향을 미칠 것입니다.

직렬화 된 데이터를 스트리밍하여 전체 대기 시간을 줄일 수 있습니까? 직렬화 된 객체 그래프의 대상이 네트워크 스트림, 파일 등인 경우 두 개 이상의 작업을 겹치게하고 전반적인 대기 시간을 줄일 수 있습니다.

사용자 지정 serialization이 더 많은 경우를 처리하도록 구조의 일반성을 줄일 수 있습니까? 나는 B :: B를보고 있는데, 사전의 값을 통해 어떤 유형이든 가져올 수 있습니다. 해당 사전에 들어있는 실제 유형이 전적으로 귀하의 통제 범위 내에있을 수 있지만 더 간단하고 통제 된 데이터 구조가 일반적으로 말하면 더 쉽고 빠르게 일련화할 수 있기 때문에 가져올 가치가 있습니다.

이용할 수있는 데이터에 중복이 있습니까? 사전에 포함 된 일부 객체가 기능적으로 동일하다는 것을 알았다면 그 객체를 그룹으로 직렬화하고 사전이 직렬화 될 때 인덱스로 참조 할 수 있습니다.

또한 성능에 미치는 효과 크기를 과소 평가하지 마십시오.다시 말하지만, 그것은 프로그램이 구조체로 무엇을하는지에 달려 있지만, 큰 바이트 스트림 자체를 생성하더라도 시간 비용이 발생할 수 있습니다. 물론 네트워크를 통해 더 많은 바이트를 보내거나 파일을 보내려면 시간이 더 많이 걸립니다.

클래스에 대한 최소한의 사용자 지정 serialization 코드를 작성하면 훨씬 많은 메타 데이터를 작성할 필요가 없기 때문에 런타임의 기본 serialization보다 순수한 개선이 될 것이라고 제안합니다. 자녀 구성원의 건설도 더 빨라야합니다.

또 다른 기법 (여기에 도움이 될 수도 있고 도움이되지 않을 수도 있음)은 직렬화를 위해 데이터 구조를 더 잘 연결합니다. 예를 들어 트리 구조가있는 경우 트리를 반복적으로 처리하는 비용을 들이지 않고 순서대로 모두 열거 할 수 있도록 부모 - 자식 참조 외에 형제 - 형제 참조를 유지하십시오. 힙 (heap)도 마음에 온다. 항목이 개별적으로 서로 어떻게 관련되어 있는지에 관계없이 힙의 항목을 반복 할 수 있습니다.

관련 문제