Python 内存中的稀疏矩阵大小

Python 内存中的稀疏矩阵大小,python,scipy,scikit-image,Python,Scipy,Scikit Image,我有一个巨大的图像数据集,分辨率为1280*1918,格式为.jpg。磁盘上的一个图像的重量

我有一个巨大的图像数据集,分辨率为1280*1918,格式为.jpg。磁盘上的一个图像的重量<100KB,但当我用
skimage.io
加载它时,它需要超过7MB。所以我决定尝试以稀疏格式存储它。但这会带来意想不到的结果

因此,我有以下代码:

from skimage.io import imread
from scipy import sparse

suffixes = ['B', 'KB', 'MB', 'GB', 'TB', 'PB']
def humansize(nbytes):
    i = 0
    while nbytes >= 1024 and i < len(suffixes)-1:
        nbytes /= 1024.
        i += 1
    f = ('%.2f' % nbytes).rstrip('0').rstrip('.')
    return '%s %s' % (f, suffixes[i])

first_image = imread("imgname.jpg")
humansize(sys.getsizeof(first_image))
>>> 7.02 MB
我知道这只是图像的三分之一,但80*3远低于我的预期。这个尺寸是真的吗?有没有其他方法来存储图像,并在记忆方面更有效?
我的目标是在8GB内存中存储最接近5000的图像。

JPEG图像被压缩。这就是它们非常小的原因。如果加载这样的图像,它将被解压缩,内存中的原始像素数据将大得多。只有当图像几乎不包含任何内容(即大量0值黑色像素)时,稀疏表示才会有所帮助。如果不是这样,您可以将原始文件内容保留在内存中,并在需要时解压缩单个图像。请注意,BSR矩阵的报告大小始终相同,即使是空矩阵。@kazemakase我确实知道存在压缩。存储原始文件的想法实际上很好,谢谢。我相信imread可以处理动态解压缩,而不是从文件中。在我的例子中,图片中有更多的白色,因此更令人惊讶的是尺寸很小。我想知道我是否测量不正确。您只测量稀疏矩阵对象的大小,而不测量它包含的数据的大小。有关更多详细信息,请参阅。@kazemakase我将进行测试that@kazemakase所以我测试了它,它是4.7MB。非常感谢。您可能应该提交一个答案。JPEG图像是压缩的。这就是它们非常小的原因。如果加载这样的图像,它将被解压缩,内存中的原始像素数据将大得多。只有当图像几乎不包含任何内容(即大量0值黑色像素)时,稀疏表示才会有所帮助。如果不是这样,您可以将原始文件内容保留在内存中,并在需要时解压缩单个图像。请注意,BSR矩阵的报告大小始终相同,即使是空矩阵。@kazemakase我确实知道存在压缩。存储原始文件的想法实际上很好,谢谢。我相信imread可以处理动态解压缩,而不是从文件中。在我的例子中,图片中有更多的白色,因此更令人惊讶的是尺寸很小。我想知道我是否测量不正确。您只测量稀疏矩阵对象的大小,而不测量它包含的数据的大小。有关更多详细信息,请参阅。@kazemakase我将进行测试that@kazemakase所以我测试了它,它是4.7MB。非常感谢。你可能应该提交一个答案。
sps = sparse.bsr_matrix(first_image[:,:,0])
humansize(sys.getsizeof(sys))
>>> 80 B