【问题标题】:Logging Multiple JSON Objects to a Single File - File Format将多个 JSON 对象记录到单个文件 - 文件格式
【发布时间】:2013-03-07 15:02:10
【问题描述】:
我有一个解决方案,我需要能够将多个 JSON 对象记录到一个文件中。基本上每天做一个日志文件。从单个文件中写入(然后读取)这些内容的最简单方法是什么?
MongoDB 如何使用 BSON 处理这个问题?它用什么作为“记录”之间的分隔符?
Protocol Buffers、BSON、MessagePack 等是否提供压缩和记录概念?压缩将是一个很好的好处。
【问题讨论】:
标签:
json
logging
protocol-buffers
bson
messagepack
【解决方案1】:
使用协议缓冲区,您可以如下定义消息:
Message JSONObject {
required string JSON = 1;
}
Message DailyJSONLog {
repeated JSONObject JSON = 1;
}
这样你就可以从内存中读取文件并反序列化它。序列化它们的方式也基本相同。在磁盘上获得文件(序列化DailyJSONLog)后,您可以轻松地将序列化JSONObjects 附加到该文件的末尾(因为DailyJSONLog 消息非常简单地是一个重复字段)。
唯一的问题是,如果您每天有很多消息,或者如果您想在一天中从某个位置开始(您无法轻松到达重复消息的中间(或任意)列表)。
我通过使用JSONObject,对其进行序列化,然后对其进行base64 编码来解决这个问题。我会将这些存储到一个由新行分隔的文件中。这使您可以非常轻松地查看每个文件中有多少条记录,访问文件中的任意 JSON 对象并轻松地继续扩展文件(您也可以非常简单地扩展上述“重复”消息,但它是一种简单的操作方式...)
压缩是一个不同的主题。协议缓冲区不会压缩字符串。如果您要定义一条 pb 消息来匹配您的 JSON 消息,那么您将受益于让 pb 可能将任何整数“压缩”成它们的 [varint][1] 编码格式。如果您也尝试使用上述 base64 编码路线,您将获得“更少”的压缩。