我正在尝试保存大量图像。我想以一种尽可能减少磁盘内存的格式保存它们。我已经在python中使用HDF5和cPickle进行了测试。令人惊讶的是,我发现PyTables和cPickle生成的数据文件比包含相同数量图像的文件夹大得多。
我的代码在这里:
private async void Handle_Clicked (object sender, System.EventArgs e)
{
try
{
using (var client = new HttpClient ()) {
var response = await client.GetAsync ($"http://xxxxxxxxxxxx.aspx?title={title_entry.Text}&details={details_entry.Text}");
// TODO do something with response
}
}
catch(Exception ex)
{
// Handle error
}
}
包含1000份import cv2
import copy
import cPickle as pickle
import tables
import numpy as np
image = cv2.imread("aloel.jpg")
images = []
for i in xrange(1000):
images.append(copy.deepcopy(image))
images = np.asarray(images, dtype=np.uint8)
hdf5_path = "img.hdf5"
filters = tables.Filters(complevel=5, complib='blosc')
with tables.open_file(hdf5_path, mode='w', filters=filters) as hdf5_file:
data_storage = hdf5_file.create_array(hdf5_file.root, 'data', obj=images)
with open('img.pickle', 'wb') as f:
pickle.dump(images, f, protocol=pickle.HIGHEST_PROTOCOL)
副本的文件夹消耗 61.5 MB ,但aloel.jpg
和img.hdf5
都 1.3GB 大小。
我想知道为什么会这样?如果是这种情况,是否意味着将图像数据直接保存到单个图像文件中而不是将它们保存到pickle文件或hdf5文件中会更好?
答案 0 :(得分:0)
更新:
你的问题是根本没有应用压缩,因为首先你需要进行分块,这可以通过将“create_array”替换为“create_carray”来实现。然后,将“zlib”应用于Complevel 5,您应该已经看到了一些改进。当然,对于这种特殊情况,在重复数据轴上设置分块也是有意义的,因此如果在chunkshape=[100,100,100,3]
命令中添加create_carray
之类的内容,您应该会看到一个重大变化。
Jpeg是一种高效的有损压缩算法。 Blosc针对速度进行了优化,默认情况下根本不压缩pickle。 HDF5还有其他选项,请查看https://support.hdfgroup.org/services/filters.html,我相信你可以找到一个足够接近原始jpeg的方法。