我想不出进一步减少该程序内存使用的方法。 基本上,我正在将 JSON 日志文件读入 pandas 数据框,但是:
- list
append函数是导致问题的原因。它在内存中创建两个不同的对象,导致大量内存使用。 .to_picklepandas 的方法也是一个巨大的内存消耗,因为内存中最大的峰值是在写入 pickle 时。
这是我迄今为止最有效的实现:
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')
有没有简单的方法来减少内存?注释代码可以完成这项工作,但需要 100-1000 倍的时间。我目前在 .to_pickle 部分最大内存使用量为 45%,在读取日志期间为 30%。但是日志越多,这个数字就越高。
请您参考如下方法:
这个答案是针对一般 pandas dataFrame 内存使用优化的:
默认情况下,Pandas 将 string 列加载为 object 类型。对于类型为 object 的所有列,尝试通过将字典传递给 dtypes 的参数,将类型分配给这些列 category strong>read_csv 功能。对于具有 50% 或更少唯一值的列,内存使用量会显着降低。
默认情况下,Pandas 将数字列读取为 float64。如果可能,使用 pd.to_numeric 将 float64 类型向下转换为 32 或 16。这再次节省了您的内存。
加载 csv 数据逐 block 。处理它,然后继续下一个 block 。这可以通过为 read_csv 方法的 chunk_size 参数指定值来完成。
