fur*_*559 1 python memory json pickle pandas
我无法想出一种方法来进一步减少该程序的内存使用量.这是我迄今为止最有效的实现:
columns = ['eventName', 'sessionId', "eventTime", "items", "currentPage", "browserType"]
df = pd.DataFrame(columns=columns)
l = []
for i, file in enumerate(glob.glob("*.log")):
print("Going through log file #%s named %s..." % (i+1, file))
with open(file) as myfile:
l += [json.loads(line) for line in myfile]
tempdata = pd.DataFrame(l)
for column in tempdata.columns:
if not column in columns:
try:
tempdata.drop(column, axis=1, inplace=True)
except ValueError:
print ("oh no! We've got a problem with %s column! It don't exist!" % (badcolumn))
l = []
df = df.append(tempdata, ignore_index = True)
# very slow version, but is most memory efficient
# length = len(df)
# length_temp = len(tempdata)
# for i in range(1, length_temp):
# update_progress((i*100.0)/length_temp)
# for column in columns:
# df.at[length+i, column] = tempdata.at[i, column]
tempdata = 0
print ("Data Frame initialized and filled! Now Sorting...")
df.sort(columns=["sessionId", "eventTime"], inplace = True)
print ("Done Sorting... Changing indices...")
df.index = range(1, len(df)+1)
print ("Storing in Pickles...")
df.to_pickle('data.pkl')
Run Code Online (Sandbox Code Playgroud)
基本上,我正在从json日志文件读取到pandas数据帧,但append函数是导致问题的原因.它在内存中创建了两个不同的对象,导致大量内存使用.另外,似乎熊猫的.to_pickle方法也是一个巨大的记忆力,因为内存中最大的峰值是写入泡菜时.有减轻记忆的简单方法吗?评论的代码可以完成这项工作,但需要100-1000倍的时间.我目前在.to_pickle部分的最大内存占用率为45%,在读取日志期间占30%.但是日志越多,数字就越高.谢谢你的帮助,
最好的,F
这个答案是针对一般pandas dataFrame内存使用优化的:
默认情况下,Pandas在字符串列中作为对象类型加载.对于所有这些都是类型的列对象,尝试分配类型类别传递一个字典参数这些列dtypes的的read_csv功能.对于具有50%或更少唯一值的列,内存使用量会显着降低.
Pandas 默认将数字列读入float64.如果可能,使用pd.to_numeric将float64类型向下转换为32或16.这再次为您节省了记忆.
按块加载csv数据块.处理它,然后继续下一个块.这可以通过为read_csv方法的chunk_size参数指定值来完成.
| 归档时间: |
|
| 查看次数: |
3658 次 |
| 最近记录: |