我正在实现一个需要序列化和反序列化大对象的程序,所以我正在进行一些测试pickle,cPickle并marshal选择模块来选择最佳模块.一路上我发现了一些非常有趣的东西:
我正在使用dumps然后loads(对于每个模块)列表中的dicts,元组,整数,浮点数和字符串.
这是我的基准测试的输出:
DUMPING a list of length 7340032
----------------------------------------------------------------------
pickle => 14.675 seconds
length of pickle serialized string: 31457430
cPickle => 2.619 seconds
length of cPickle serialized string: 31457457
marshal => 0.991 seconds
length of marshal serialized string: 117440540
LOADING a list of length: 7340032
----------------------------------------------------------------------
pickle => 13.768 seconds
(same length?) 7340032 == 7340032
cPickle => 2.038 seconds
(same length?) 7340032 == 7340032
marshal => 6.378 seconds
(same …Run Code Online (Sandbox Code Playgroud) 我们有一个基于Python的Web服务器,它可以在启动时使用大量数据文件cPickle.数据文件(使用pickled HIGHEST_PROTOCOL)在磁盘上大约为0.4 GB,并加载到内存中大约1.2 GB的Python对象 - 这大约需要20秒.我们在64位Windows机器上使用Python 2.6.
瓶颈肯定不是磁盘(实际读取那么多数据需要不到0.5秒),但是内存分配和对象创建(创建了数百万个对象).我们希望减少20秒以减少启动时间.
有没有办法将超过1GB的对象反序列化到Python中cPickle(比如5-10x)?因为执行时间受内存分配和对象创建的约束,所以我假设使用另一种解开技术(如JSON)在这里没有帮助.
我知道有些解释型语言可以将整个内存映像保存为磁盘文件,因此可以一次性将其加载回内存,而无需为每个对象分配/创建.在Python中有没有办法做到这一点,或者实现类似的东西?
我正在尝试以 json 格式发送 OpenCV 图像并在另一端接收它,但在编码和解码图像时遇到了无穷无尽的问题
我通过以下方式以 JSON 形式发送它:
dumps({"image": b64encode(image[y1:y2, x1:x2]).decode('utf-8')})
Run Code Online (Sandbox Code Playgroud)
在另一端,我尝试解码它(我需要它作为枕头图像):
image = Image.open(BytesIO(base64.b64decode(data['image'])))
Run Code Online (Sandbox Code Playgroud)
但我越来越Exception cannot identify image file <_io.BytesIO object at 0x7fbd34c98a98>
还尝试过:
nparr = np.fromstring(b64decode(data['image']), np.uint8)
image = cv2.imdecode(nparr, cv2.COLOR_BGR2RGB)
pil_image = Image.fromarray(image)
Run Code Online (Sandbox Code Playgroud)
但后来我'NoneType' object has no attribute '__array_interface__'来自Image.fromarray
有什么想法我做错了吗?