最近我发现了MessagePack,这是Google的Protocol Buffers和JSON的替代二进制序列化格式,它也优于两者.
还有MongoDB用于存储数据的BSON序列化格式.
有人可以详细说明BSON与MessagePack的差异和优势吗?
只是为了完成高效的 二进制序列化格式列表:还有Gobs将成为Google协议缓冲区的继承者.然而,与所有其他提到的格式相比,这些格式不是语言无关的,并且依赖于Go的内置反射,至少还有除Go之外的其他语言的Gobs库.
msgpack似乎是一种非常快速的,如果是非常新的数据序列化格式.它是否具有可识别的MIME类型?如果没有,过渡时应该使用什么?
我在尝试安装时遇到问题.我继续使用Debian 9上的命令行升级anaconda,我收到错误消息"分布式1.21.0需要msgpack,未安装".
然后我尝试了一个conda install mspack,然后一个pip install --upgade plotly,我得到"分发1.22.0需要msgpack,没有安装".这个1.22.0错误消息启动了我的许多软件包的整个升级过程.这会破坏吗?不知道,还没试过,但从msgpack网站https://msgpack.org/判断,很可能会导致错误.我猜,我们会看到.不知道还能做什么.
pip install msgpack 不解决问题
msgpack在熊猫应该是一个替代品pickle.
这是一种轻量级的可移植二进制格式,类似于二进制JSON,具有很高的空间效率,并且在写入(序列化)和读取(反序列化)方面都提供了良好的性能.
然而,我发现它的性能似乎与咸菜不相上下.
df = pd.DataFrame(np.random.randn(10000, 100))
>>> %timeit df.to_pickle('test.p')
10 loops, best of 3: 22.4 ms per loop
>>> %timeit df.to_msgpack('test.msg')
10 loops, best of 3: 36.4 ms per loop
>>> %timeit pd.read_pickle('test.p')
100 loops, best of 3: 10.5 ms per loop
>>> %timeit pd.read_msgpack('test.msg')
10 loops, best of 3: 24.6 ms per loop
Run Code Online (Sandbox Code Playgroud)
问题: 除了泡菜的潜在安全问题,msgpack对pickle有什么好处?pickle仍然是序列化数据的首选方法,还是目前存在更好的替代方案?
当使用 SignalR 和 MessagePack 在 JavaScript 和 C# 之间序列化和反序列化值时,我在接收端看到 C# 中的一些精度损失。
例如,我将值 0.005 从 JavaScript 发送到 C#。当反序列化的值出现在 C# 端时,我得到的值0.004999999888241291很接近,但不是 0.005。JavaScript 端的值是Number和我正在使用的 C# 端double。
我读过 JavaScript 无法准确表示浮点数,这会导致像0.1 + 0.2 == 0.30000000000000004. 我怀疑我看到的问题与 JavaScript 的这个特性有关。
有趣的部分是,我没有看到同样的问题反过来。将 0.005 从 C# 发送到 JavaScript 会导致 JavaScript 中的值 0.005。
编辑:来自 C# 的值只是在 JS 调试器窗口中缩短了。正如@Pete 提到的,它确实扩展到不完全是 0.5 的值(0.005000000000000000104083408558)。这意味着差异至少发生在双方。
JSON 序列化没有相同的问题,因为我假设它通过字符串传递,这使得接收环境处于控制状态,并将值解析为其本机数字类型。
我想知道是否有一种方法可以使用二进制序列化在双方都有匹配的值。
如果不是,这是否意味着无法在 JavaScript 和 C# 之间进行 100% 准确的二进制转换?
使用的技术:
我的代码基于 …
我听说过可以用来压缩json消息的MsgPack,但我有一个问题,为什么不简单地使用Gzip/Deflate而不是MsgPack?我认为调试也好.
考虑这个简单的例子
import pandas as pd
mydata = pd.DataFrame({'mytime': [pd.to_datetime('2018-01-01 10:00:00.513'),
pd.to_datetime('2018-01-03 10:00:00.513')],
'myvariable': [1,2],
'mystring': ['hello', 'world']})
mydata
Out[7]:
mystring mytime myvariable
0 hello 2018-01-01 10:00:00.513 1
1 world 2018-01-03 10:00:00.513 2
Run Code Online (Sandbox Code Playgroud)
我知道我可以msgpack使用Pandas以下方式写入该数据框:
mydata.to_msgpack('C://Users/john/Documents/mypack')
Run Code Online (Sandbox Code Playgroud)
问题是:如何读取该msgpack文件R?
using RcppMsgPack返回一些令人困惑的输出,不是dataframe/tibble
library(tidyverse)
library(RcppMsgPack)
df <- msgpack_read('C://Users/john/Documents/mypack', simplify = TRUE)
> df
$axes
$axes[[1]]
$axes[[1]]$typ
[1] "index"
$axes[[1]]$name
NULL
$axes[[1]]$klass
[1] "Index"
$axes[[1]]$compress
NULL
$axes[[1]]$data
[1] "mystring" "mytime" "myvariable"
$axes[[1]]$dtype
[1] "object"
$axes[[2]] …Run Code Online (Sandbox Code Playgroud) 要求:具有2-3级嵌套的Python对象,包含基本数据类型,如整数,字符串,列表和dicts.(没有日期等),需要作为json存储在redis中以对照密钥.什么是可用于将json压缩为低内存占用的字符串的最佳方法.目标对象不是很大,平均有1000个小元素,或者转换为JSON时大约有15000个字符.
例如.
>>> my_dict
{'details': {'1': {'age': 13, 'name': 'dhruv'}, '2': {'age': 15, 'name': 'Matt'}}, 'members': ['1', '2']}
>>> json.dumps(my_dict)
'{"details": {"1": {"age": 13, "name": "dhruv"}, "2": {"age": 15, "name": "Matt"}}, "members": ["1", "2"]}'
### SOME BASIC COMPACTION ###
>>> json.dumps(my_dict, separators=(',',':'))
'{"details":{"1":{"age":13,"name":"dhruv"},"2":{"age":15,"name":"Matt"}},"members":["1","2"]}'
Run Code Online (Sandbox Code Playgroud)
1 /还有其他更好的方法来压缩json以节省redis内存(同时确保轻量级解码).
2/msgpack [http://msgpack.org/]的候选人有多好?
3 /我还要考虑泡菜这样的选择吗?
它是如何能够提供三个功能:msgpack_pack,msgpack_unpack和msgpack_object(?还有,什么是他们的意义,精确地)为用户定义的C++类(以同样的方式MSGPACK_DEFINE做它用在非阵列POD/UD类型)包含普通老式数据数组(例如dobule[]或者char[]),所以我的类可以很好地使用更高级别的类,在地图或向量中包含这个类?
是否有任何为您自己的类或至少msgpack C++ api文档实现它们的示例?
我发现可能的API参考的唯一链接是http://redmine.msgpack.org/projects/msgpack/wiki ; 但它现在已经死了.
说,我有一个类似的结构
struct entity {
const char name[256];
double mat[16];
};
Run Code Online (Sandbox Code Playgroud)
什么是msgpack_*成员函数呢?