JSON과 BSON을 비교하십시오.


37

개체를 직렬화하기 위해 JSON과 BSON을 비교하고 있습니다. 이 객체에는 다수의 정수 배열이 포함되어 있습니다. 내 테스트에서 직렬화하는 객체에는 총 약 12,000 개의 정수가 들어 있습니다. 직렬화 된 결과의 크기를 비교하는 방법에만 관심이 있습니다. 직렬화를 수행하는 라이브러리로 JSON.NET을 사용하고 있습니다. Javascript에서 작업 할 수 있기를 원하기 때문에 JSON을 사용하고 있습니다.

JSON 문자열의 크기는 약 43kb이고 BSON 결과의 크기는 161kb입니다. 그래서 약 4의 차이가 있습니다. 이것은 BSON이 데이터 저장에 더 효율적이라고 생각했기 때문에 BSON을 보았 기 때문에 예상했던 것과 다릅니다.

내 질문에 왜 BSON이 효율적이지 않습니까? 더 효율적으로 만들 수 있습니까? 또는 Javascript로 쉽게 처리 할 수있는 많은 수의 정수가 포함 된 배열로 데이터를 serialize하는 다른 방법이 있습니까?

다음은 JSON/BSON 직렬화를 테스트하는 코드입니다.

 // Read file which contain json string 
     string _jsonString = ReadFile(); 
     object _object = Newtonsoft.Json.JsonConvert.DeserializeObject(_jsonString); 
     FileStream _fs = File.OpenWrite("BsonFileName"); 
     using (Newtonsoft.Json.Bson.BsonWriter _bsonWriter = new BsonWriter(_fs) 
       { CloseOutput = false }) 
     { 
      Newtonsoft.Json.JsonSerializer _jsonSerializer = new JsonSerializer(); 
      _jsonSerializer.Serialize(_bsonWriter, _object); 
      _bsonWriter.Flush(); 
     } 

편집 :

여기 https://skydrive.live.com/redir?resid=9A6F31F60861DD2C!362&authkey=!AKU-ZZp8C_0gcR0

+3

, (32 비트 또는 64 비트 정수로보다 하나의 ASCII 바이트로 회선을 통해, 예를 들어, "2"를 전송하는 것이보다 효율적일 수있다 4 및 8 바이트). 이 데이터 (또는 유사한 데이터)가 데이터의 속성 일 수 있습니까? 26 sep. 122012-09-26 15:09:38

  0

올바르게 이해하면 ASCII/UTF-8 인코딩이 현재 JSON에서하고있는 작업입니다. 정수 배열을 가진 객체는 JSON 형식의 문자열로 직렬화됩니다. 이 문자열은 유선을 통해 전송되거나 UTF-8로 인코딩 된 디스크에 저장됩니다. 따라서 숫자는 ASCII/UTF-8 바이트로 전송됩니다. 내가 틀렸다면 나를 바로 잡아주세요. 27 sep. 122012-09-27 06:56:40

  0

[Here] (https://coderwall.com/p/ccdryg)는 PHP에서 Json과 Bson의 훌륭한 성능 벤치 마크입니다. 또한 [protocol-buffers-versus-json-or-bson] (http://stackoverflow.com/questions/2000933/protocol-buffers-versus-json-or-bson)을 참조하십시오. 17 jul. 142014-07-17 09:32:36

62

BSON 대 JSON의 효율성 당신이 저장하고있는 정수의 크기에 따라 결과 파일입니다. ASCII가 실제로 정수 유형을 저장하는 것보다 적은 바이트를 차지하는 흥미로운 점이 있습니다. 여러분의 BSON 문서가 어떻게 나타나는지 64 비트 정수가 8 바이트를 차지합니다. 여러분의 숫자는 모두 10,000보다 작습니다. 즉, ASCII로 4 바이트 (각 문자 당 9999까지 1 바이트)를 저장할 수 있습니다. 실제로 대부분의 데이터는 1000 개 미만으로 보이므로 3 바이트 이하로 저장할 수 있습니다. 물론, 비 직렬화는 시간이 걸리고 싸지는 않지만 공간을 절약합니다. 또한 Javascript는 모든 숫자를 나타 내기 위해 64 비트 값을 사용하므로 각 정수를 더 적절한 데이터 형식으로 변환 한 후 BSON에 작성하면 BSON 파일이 훨씬 커질 수 있습니다.

사양에 따르면 BSON에는 JSON에서 제공하지 않는 많은 메타 데이터가 포함되어 있습니다. 당신은 당신이에 관심이없는 데이터를 건너 뛸 수 있도록이 메타 데이터는 대부분 길이 접두사입니다 예를 들어, 다음과 같은 데이터 수행하십시오. 당신이 JSON을 사용하는 경우, 지금

["hello there, this is an necessarily long string. It's especially long, but you don't care about it. You're just trying to get to the next element. But I keep going on and on.", 
"oh man. here's another string you still don't care about. You really just want the third element in the array. How long are the first two elements? JSON won't tell you", 
"data_you_care_about"] 

을, 당신은 전체를 분석해야 첫 번째 두 문자열 중 세 번째 문자열의 위치를 ​​찾으십시오. 당신이 BSON를 사용하는 경우 (I 예를 위해서이 마크 업 만드는거야 때문에, 실제로 있지만), 당신은 마크 업 더 같이 얻을 것이다 :

지금 그래서
[175 "hello there, this is an necessarily long string. It's especially long, but you don't care about it. You're just trying to get to the next element. But I keep going on and on.", 
169 "oh man. here's another string you still don't care about. You really just want the third element in the array. How long are the first two elements? JSON won't tell you", 
19 "data_you_care_about"] 

, 당신이 '175'을 읽을 수를 알고 앞으로 175 바이트를 건너 뛰고, '169'를 읽고, 앞으로 169 바이트를 건너 뛰고, '19'를 읽고 다음 19 바이트를 문자열에 복사하십시오. 그렇게하면 구분 기호로 문자열을 구문 분석 할 필요조차 없습니다.

하나를 다른 것을 사용하는 것은 사용자의 필요에 따라 크게 달라집니다. 전 세계에서 파싱해야 할 엄청난 양의 문서를 저장하려고하지만 디스크 공간이 제한적이라면 JSON을 사용하십시오. 크기가 작고 공간 효율적이기 때문입니다. 문서를 저장하려고하지만 서버 환경에서 대기 시간을 줄이는 것이 디스크 공간을 절약하는 것보다 더 중요 할 경우 BSON을 사용하십시오.

귀하가 선택한 것으로 고려해야 할 또 다른 사항은 사람의 가독성입니다. BSON이 포함 된 오류 보고서를 디버깅해야하는 경우에는 해독 유틸리티가 필요할 것입니다. 아마도 BSON을 아는 것만은 아니지만 JSON을 읽을 수 있습니다.당신은 작은 숫자가 많은 경우

FAQ