我有一个巨大的csv文件,无法加载到内存中。将其转换为libsvm格式可能会节省一些内存。 csv文件中有很多nan。如果我读取行并将它们存储为np.array,并将np.nan设置为NULL,那么数组是否仍会占用太多内存? 数组中的np.nan是否也占用内存?
答案 0 :(得分:2)
据我所知,nan和zero值占用与任何其他值相同的内存,但是,您可以通过其他方式解决您的问题:
您是否尝试过使用稀疏矢量?它们适用于具有大量0值的向量,并且优化了内存消耗
如果您还有其他问题,请提供有关SVM和稀疏矩阵的信息。
编辑提供答案和解决方案
答案 1 :(得分:2)
使用floating point数字表示时,非数字值(NaN
和inf
)也由占用与任何数字浮动相同位数的特定二进制模式表示点值。因此,NaN
占用与数组中任何其他数字相同的内存量。
答案 2 :(得分:1)
根据sys模块中的getsizeof()命令,它确实如此。一个简单而快速的例子:
import sys
import numpy as np
x = np.array([1,2,3])
y = np.array([1,np.nan,3])
x_size = sys.getsizeof(x)
y_size = sys.getsizeof(y)
print(x_size)
print(y_size)
print(y_size == x_size)
这应该打印出来
120
120
True
所以我的结论是它使用的内存与普通条目一样多。
相反,您可以使用稀疏矩阵(Scipy.sparse),它们根本不保存零/ Null,因此内存效率更高。但Scipy强烈反对直接使用Numpy方法https://docs.scipy.org/doc/scipy/reference/sparse.html,因为Numpy可能无法正确解释它们。