减少内存使用熊猫

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

Vic*_*ang 7

这个答案是针对一般pandas dataFrame内存使用优化的:

  1. 默认情况下,Pandas在字符串列中作为对象类型加载.对于所有这些都是类型的列对象,尝试分配类型类别传递一个字典参数这些列dtypes的的read_csv功能.对于具有50%或更少唯一值的列,内存使用量会显着降低.

  2. Pandas 默认将数字列读入float64.如果可能,使用pd.to_numericfloat64类型向下转换为32或16.这再次为您节省了记忆.

  3. 按块加载csv数据.处理它,然后继续下一个.这可以通过为read_csv方法的chunk_size参数指定值来完成.