[英]Pandas : saving Series of dictionaries to disk
我有一个python pandas系列词典:
id dicts
1 {'5': 1, '8': 20, '1800': 2}
2 {'2': 2, '8': 1, '1000': 25, '1651': 1}
... ...
... ...
... ...
20000000 {'2': 1, '10': 20}
字典中的(键,值)表示('feature',count)。 存在大约2000个独特的功能。
该系列在熊猫中的内存使用量约为500MB。 将此对象写入磁盘的最佳方法是什么(理想情况下磁盘空间使用率低,写入速度快,后续快速读回)?
考虑的选项(并在前2个尝试过):
- to_csv(但将字典视为字符串,因此之后转换回字典非常慢)
- cPickle(但执行期间内存不足)
- 转换为scipy稀疏矩阵结构
我很好奇你的Series
如何只占用500MB。 如果您使用的是.memory_usage
方法,则只返回每个python对象引用所使用的总内存,这是您的Series正在存储的内存。 这并不能解释词典的实际记忆。 粗略计算20,000,000 * 288字节= 5.76GB应该是您的内存使用量。 288个字节是每个字典所需内存的保守估计。
无论如何,尝试以下方法将您的数据转换为稀疏矩阵表示:
import numpy as np, pandas as pd
from sklearn.feature_extraction import DictVectorizer
from scipy.sparse import csr_matrix
import pickle
我会使用int
而不是字符串作为键,因为这将在以后保持正确的顺序。 因此,假设您的系列名为dict_series
:
dict_series = dict_series.apply(lambda d: {int(k):d[k] for k in d}
这可能是内存密集型的,你可能最好只使用int
s作为键从一开始创建你的dict
Series
。 或者只是你可以跳过这一步。 现在,构建稀疏矩阵:
dv = DictVectorizer(dtype=np.int32)
sparse = dv.fit_transform(dict_series)
现在,基本上,您的稀疏矩阵可以从3个字段重建: sparse.data
, sparse.indices
, sparse.indptr
,可选的sparse.shape
。 保存数据sparse.data
, sparse.indices
, sparse.indptr
的最快且最节省内存的方法是使用np.ndarray tofile
方法,该方法将数组保存为原始字节。 从文档 :
这是一种便于快速存储阵列数据的功能。 有关字节序和精度的信息会丢失,因此对于要在具有不同字节序的计算机之间存档数据或传输数据的文件,此方法不是一个好的选择。
所以这种方法会丢失任何dtype信息和endiamness。 前一个问题可以通过简单地记录数据类型来处理,无论如何你将使用np.int32。 如果您在本地工作,后一个问题不是问题,但如果可移植性很重要,您将需要研究存储信息的其他方法。
# to save
sparse.data.tofile('data.dat')
sparse.indices.tofile('indices.dat')
sparse.indptr.tofile('indptr.dat')
# don't forget your dict vectorizer!
with open('dv.pickle', 'wb') as f:
pickle.dump(dv,f) # pickle your dv to be able to recover your original data!
with open('dv.pickle', 'rb') as f:
dv = pickle.load(f)
sparse = csr_matrix((np.fromfile('data.dat', dtype = np.int32),
np.fromfile('indices.dat', dtype = np.int32),
np.fromfile('indptr.dat', dtype = np.int32))
original = pd.Series(dv.inverse_transform(sparse))
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.