memcached中对象的最佳序列化方法是什么?

2024-04-26 00:36:49 发布

您现在位置:Python中文网/ 问答频道 /正文


Tags: python
3条回答

跨平台支持(Python,java,C++,C++,露比,perl)

可惜这个标准是第一个。大多数语言背后的意图是以不同的方式表达基本的数据结构和处理。这就是使多种语言成为“问题”的原因:它们都是不同的。

一个跨多种语言的好的表示通常是不可能的。在表现形式的丰富性、性能或模糊性方面存在折衷。

JSON很好地满足了其余的条件。消息是紧凑的,解析速度很快(不像XML)。嵌套处理得很好。在不破坏代码的情况下改变结构总是很困难的——如果删除了某些内容,旧代码就会崩溃。如果您更改了所需的内容,旧代码将中断。但是,如果要添加内容,JSON也会处理这个问题。

我喜欢人类可读性。它有助于许多调试和故障排除。

让Python元组变成列表的微妙之处并不是一个有趣的问题。接收应用程序已经知道正在接收的结构,并且可以调整它(如果它很重要的话)


按性能编辑。

http://developers.de/blogs/damir_dobric/archive/2008/12/27/performance-comparison-soap-vs-json-wcf-implementation.aspx解析XML和JSON文档

XML分析0.326 jsonParse 0.255

对于相同的内容,JSON似乎要快得多。我在Python2.5.2中使用了PythonSimpleJSON和ElementTree模块。

一个主要考虑因素是“是否需要指定每个结构定义”

如果你同意的话,你可以看看:

  1. Protocol Buffers - http://code.google.com/apis/protocolbuffers/docs/overview.html
  2. Thrift - http://developers.facebook.com/thrift/(更倾向于服务)

这两种解决方案都需要支持文件来定义每个数据结构。


如果您不想让开发人员承担预先定义每个结构的开销,那么请看一下:

  1. JSON(通过python cjson和本地PHP JSON)。如果不需要传输二进制内容(如图像等),这两种方法都非常快。
  2. 另一种标记语言@http://www.yaml.org/。如果你找到了合适的图书馆,也很快。

但是,我相信这两个都有传输二进制内容的问题,这就是为什么它们被排除在我们的使用之外。注意:YAML可能有很好的二进制支持,您必须检查客户端库——请参见这里:http://yaml.org/type/binary.html


在我们公司,我们推出了自己的库(Extruct),以支持二进制的跨语言序列化。我们目前(体面地)在Python和PHP中有快速实现,尽管由于在所有字符串上都使用base64(二进制支持),因此它不是很容易理解。最后,我们将把它们移植到C语言,并使用更标准的编码。

如果循环中有太多迭代,或者必须查看每个字符,PHP和Python之类的动态语言就会变得非常慢。另一方面,C在这类操作中大放异彩。

如果你想看看Extruct的实现,请告诉我。(联系方式在http://blog.gahooa.com/“关于我”下)

我尝试了几种方法,并将压缩JSON作为速度和内存占用之间的最佳平衡。Python的本地Pickle函数稍快一些,但生成的对象不能用于非Python客户机。

我看到了3:1的压缩,所以所有的数据都放在memcache中,应用程序的响应时间小于10毫秒,包括页面呈现。

下面是JSON、Thrift、Protocol Buffers和YAML的比较,有无压缩:

http://bouncybouncy.net/ramblings/posts/more_on_json_vs_thrift_and_protocol_buffers/

看起来这个测试得到的结果和我用压缩JSON得到的结果一样。因为我不需要预先定义每个结构,这似乎是最快和最小的跨平台答案。

相关问题 更多 >