python中保存和读取超大数量级的字典的方法
1. 背景
最近在自己尝试item2vec建立词向量方面的事情,那么训练好的词向量一般是保存在字典中。其中,item一般为一串数字或字符串,常保存为字典的key,而vectors 是一个多维向量,array或者list类型保存为字典的value。然而语料库巨大,生成的字典超级大,保存和读取使用并不方便,于是想解决这个问题。提出两个方法。
2. 方法1(针对小字典很好用)
## 读取和保存字典
# 保存
def SaveDict(dictionary,filename):
f = open('{}.txt'.format(filename),'w')
f.write(str(dictionary))
f.close()
# 读取
def ReadDict(filename):
f = open('{}.txt'.format(filename),'r')
a = f.read()
dictionary = eval(a)
f.close()
return dictionary
然而一旦数量巨大,这秒秒钟内存溢出啊。
可是如果不能直接读取的话,逐行读取并不是一个可靠的方法,因为每一行可能停在某key或value中,有同学提到可以用切分split,也不太靠谱啊,一是分不干净,二是分开之后还是字符串,处理起来不好搞。
3. 方法2 再大字典也不怕
忽然想到可以用pd.to_csv啊
import pandas as pd
dict_name # 那个字典
keys = dict_name.keys()
values = dict_name.values()
df = pd.DataFrame({'KEYS':keys,'VALUES':values})
df.to_csv('./filename.csv',index=False)
有同学说,这样子有缺点,比方说我现在要储存的字典values是个列表或者字典,这样子读取csv后,这个values会变成str啊
这个也好办!
df = pd.read_csv('./filename.csv',sep=',')
# 把VALUES列用eval抓换就好了
df['VALUES'] = df.apply(lambda x: eval(x.VALUES),axis=1)
这样子,字典超级大也可以保存和读取了!