我有一台相机每分钟记录两张图像,每天产生2880张图像,大约180kb /张。在几个月的时间内,这增加了许多图像,这使得传输数据变得麻烦。为了解决这个问题,我将图像转换为每月tar文件(例如201301.tar,201302.tar)。我在分析工作中使用图像,所以我确实需要访问数据,我遇到了两个问题:
是否有将图像数据存储在单个文件中的实用方法(我更有可能会逐月存储数据)?我认为存储为字典(key = datetime值,value = array(size = 480 x 660 x 3))是有道理的,但我在重新加载数据时遇到了问题。
# Example
import datetime as dt
from scipy.misc import imread as ir
dts = dt.datetime.strptime
image = ir('skycam-current.jpg',flatten=False)
data = {}
data[dt.datetime(2013,01,01)] = image
np.savez('test.dic.npz',data)
# Then, to re-load the data
data = np.load('test.dic.npz')
当我重新加载数据时,我得到一本字典,有点:
>>> type(data)
>>> numpy.lib.npyio.NpzFile
>>> data.keys()
>>> ['arr_0']
如果我尝试恢复字典,我会得到一个0-d数组
>>> a = data['arr_0']
>>> a.shape
>>> ()
有人可以推荐一种更好的存储字典或存储图像数据的方法吗?我一直在使用pandas进行分析/存储,但它似乎不是为存储数组而构建的。
答案 0 :(得分:2)
如果它已经被jpeg压缩,那么通过进一步压缩它并不会真正获得太大的空间优势。您是将这些放入tar档案以试图节省空间,还是因为目录需要人类可读?如果目录不需要是人类可读的,那么归档并没有太多优势,只需将每个月存储在一个单独的文件夹中,并使用sqlite数据库或文件/文件夹名称中的某些逻辑来保持跟踪他们。
答案 1 :(得分:1)
tar文件是存储不可压缩文件的好方法,比如jpgs。它比使用zip更好,因为你没有de / compress开销,并且可能比使用文件系统更好,因为你生成了很多文件。将文件存储在RAM中意味着您必须拥有专用于该任务的大量内存,这使得在机器之间访问和传输数据变得更加困难。
tar文件的一个大问题是它们don't allow random access,因为它们没有像zip文件那样编入索引。这意味着,要从存档中间提取文件,您必须阅读整个存档,直到找到该文件。
要解决此限制,有几个人已经构建了tar文件索引器,它们将偏移存储到存档中的文件中,以便您可以直接读取它们。其中一个项目是tarindexer,可以用python方便地编写,因此您可以轻松地将其用作库。它只有100行,所以它也很容易理解和适应。