【问题标题】:Which serialization method/function/BIF has the best performance in Erlang?Erlang 中哪种序列化方法/函数/BIF 性能最好?
【发布时间】:2011-12-17 23:15:02
【问题描述】:

哪种序列化方法/函数/BIF 等在 Erlang 中性能最好? 我的情况是:

  1. 我有内存缓存,其中包含我需要检索每个请求的数据。
  2. 检索的数据是二进制项(当我执行 binary_to_term 时有一个小数据列表)
  3. 我需要对这些数据进行一些逻辑处理,因此我需要对它们进行反序列化。
  4. 在另一个系统上,我将该数据设置在该内存缓存中,以便我可以更改所有内容。

请帮我选择序列化的方法。 只有表现才是我的目标。 谢谢!

【问题讨论】:

  • 你能解释一下你的架构吗?第 1 点和第 4 点中的内存缓存实例是否相同?数据是否被非 erlang 应用程序使用? binary_to_term 太慢了吗?如果是这样,您当前的基准数字是多少,您需要达到什么水平?您是否尝试过使用 mnesia 或 ets?为什么不在管理您现在放入内存缓存中的数据的节点上保持进程处于活动状态。
  • 1. Memcache 实例是同一个。 2. erlang 应用程序不使用数据,但如果将来可以使用,那就太好了。
  • 我的目标是尽可能快地为客户端反序列化数据。序列化可能很慢,反序列化必须很快。

标签: performance serialization erlang


【解决方案1】:

binary_to_term 是你的朋友。这正是您所需要的。

如果您想利用这些数据购买其他非 erlang 系统,这里有一个库列表可以帮助您:http://bert-rpc.org/

【讨论】:

  • 那么在性能方面没有比 binary_to_term 更好的东西了吗?如果那是真的,那么我就确定了;)
  • 现在我正在做这样的事情:1. 是内存缓存中的数据 -> 获取 -> binary_to_term 2. 如果不生成内容 -> 内存缓存 -> 设置 -> term_to_binary
  • Tereshka 我们使用非常相似的方法将数据存储在 riak 中(从应用程序的角度来看,riak 和 memcache 几乎没有区别)。
  • 并且您正在使用 binary_to_term BIF 的数据仅用于 Erlang 应用程序和 BERT 用于其他应用程序?对吗?
  • 是的。当需要通过字符敏感通道发送二进制数据时,我们还使用base64:decode/1base64:encode/1 函数。
【解决方案2】:

二进制 Erlang 格式的替代方案可能是 Google protocol buffers。它是一种“一种语言中立、平台中立、可扩展的结构化数据序列化方式,用于通信协议、数据存储等”。 Basho 的 Riak 产品使用的 Erlang 实现是 available on Github

【讨论】:

  • 嗨 WardB,在我尝试 protobuf 时(大约 4 个月前),它的实现没有正确支持所需的类型。
  • 您好 MinimeDJ,很高兴知道我想很快在项目中使用协议缓冲区。谢谢
  • 我已经尝试了所有可用的方法(protobuf、Thrift 和一些其他自定义解决方案),我相信 binary_to_term 是完成这项工作的最佳选择。当binary_to_term 正常工作时,所有其他解决方案都有您真正不需要的功能。当然它不像其他的那么灵活,但是它没有feature-bugs而且速度非常快。
  • @Worker 既然你也是 piqi 的人之一......我一直想知道,a)如果 erlang 驱动程序序列化也只是 term_to_binary... 函数,或者它是否使用另一个序列化协议(用于管道司机)。 b) 为什么世界上从来没有人为 elang 术语的序列化编写过 ASN.1 定义?如果有人有...
  • 2 全部:使用 protobuf。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-09-23
  • 2013-06-21
  • 1970-01-01
  • 2019-05-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多