如何清除 pandas 中的 Dataframe 内存?
How to clear Dataframe memory in pandas?
我正在使用 pandas read_fwf 方法将固定宽度文件转换为定界符文件(“|”定界符)。我的输入文件 ("infile.txt") 大约有 16GB 和 990 万条记录,在创建数据框时,它在创建输出文件之前占用了几乎 3 倍的内存(大约 48GB)。有人可以帮助我改进下面的逻辑吗,并通过一些额外内存的来源(我知道'seq_id,fname 和 loaddatime 将占用一些 space,它应该只有几 GB)。
注:
我正在一个接一个地循环处理多个文件(大小相似的文件)。所以我必须在下一个文件接管之前清除内存。
'''infile.txt'''
1234567890AAAAAAAAAA
1234567890BBBBBBBBBB
1234567890CCCCCCCCCC
'''test_layout.csv'''
FIELD_NAME,START_POS,END_POS
FIELD1,0,10
FIELD2,10,20
'''test.py'''
import datetime
import pandas as pd
import csv
from collections import OrderedDict
import gc
seq_id = 1
fname= 'infile.txt'
loadDatetime = '04/10/2018'
in_layout = open("test_layout.csv","rt")
reader = csv.DictReader(in_layout)
boundries, col_names = [[],[]]
for row in reader:
boundries.append(tuple([int(str(row['START_POS']).strip()) , int(str(row['END_POS']).strip())]))
col_names.append(str(row['FIELD_NAME']).strip())
dataf = pd.read_fwf(fname, quoting=3, colspecs = boundries, dtype = object, names = col_names)
len_df = len(dataf)
'''Used pair of key, value tuples and OrderedDict to preserve the order of the columns'''
mod_dataf = pd.DataFrame(OrderedDict((('seq_id',[seq_id]*len_df),('fname',[fname]*len_df))), dtype=object)
ldt_ser = pd.Series([loadDatetime]*len_df,name='loadDatetime', dtype=object)
dataf = pd.concat([mod_dataf, dataf],axis=1)
alldfs = [mod_dataf]
del alldfs
gc.collect()
mod_dataf = pd.DataFrame()
dataf = pd.concat([dataf,ldt_ser],axis=1)
dataf.to_csv("outfile.txt", sep='|', quoting=3, escapechar='\' , index=False, header=False,encoding='utf-8')
''' Release Memory used by DataFrames '''
alldfs = [dataf]
del ldt_ser
del alldfs
gc.collect()
dataf = pd.DataFrame()
我使用垃圾收集器、del dataframe 并初始化以清除使用的内存,但仍然没有从 dataframe 释放总内存。
灵感来自
'''OUTPUT'''
1|infile.txt|1234567890|AAAAAAAAAA|04/10/2018
1|infile.txt|1234567890|BBBBBBBBBB|04/10/2018
1|infile.txt|1234567890|CCCCCCCCCC|04/10/2018
我遇到了和你一样的问题
我通过在 class 中以不同的方法拆分我的代码,找到了使用 gc.collect() 的解决方案。例如:
Class A:
def __init__(self):
# your code
def first_part_of_my_code(self):
# your code
# I want to clear my dataframe
del my_dataframe
gc.collect()
my_dataframe = pd.DataFrame() # not sure whether this line really helps
return my_new_light_dataframe
def second_part_of_my_code(self):
# my code
# same principle
所以当程序调用方法时,一旦程序离开方法,垃圾收集器就会清除内存。
我正在使用 pandas read_fwf 方法将固定宽度文件转换为定界符文件(“|”定界符)。我的输入文件 ("infile.txt") 大约有 16GB 和 990 万条记录,在创建数据框时,它在创建输出文件之前占用了几乎 3 倍的内存(大约 48GB)。有人可以帮助我改进下面的逻辑吗,并通过一些额外内存的来源(我知道'seq_id,fname 和 loaddatime 将占用一些 space,它应该只有几 GB)。
注: 我正在一个接一个地循环处理多个文件(大小相似的文件)。所以我必须在下一个文件接管之前清除内存。
'''infile.txt'''
1234567890AAAAAAAAAA
1234567890BBBBBBBBBB
1234567890CCCCCCCCCC
'''test_layout.csv'''
FIELD_NAME,START_POS,END_POS
FIELD1,0,10
FIELD2,10,20
'''test.py'''
import datetime
import pandas as pd
import csv
from collections import OrderedDict
import gc
seq_id = 1
fname= 'infile.txt'
loadDatetime = '04/10/2018'
in_layout = open("test_layout.csv","rt")
reader = csv.DictReader(in_layout)
boundries, col_names = [[],[]]
for row in reader:
boundries.append(tuple([int(str(row['START_POS']).strip()) , int(str(row['END_POS']).strip())]))
col_names.append(str(row['FIELD_NAME']).strip())
dataf = pd.read_fwf(fname, quoting=3, colspecs = boundries, dtype = object, names = col_names)
len_df = len(dataf)
'''Used pair of key, value tuples and OrderedDict to preserve the order of the columns'''
mod_dataf = pd.DataFrame(OrderedDict((('seq_id',[seq_id]*len_df),('fname',[fname]*len_df))), dtype=object)
ldt_ser = pd.Series([loadDatetime]*len_df,name='loadDatetime', dtype=object)
dataf = pd.concat([mod_dataf, dataf],axis=1)
alldfs = [mod_dataf]
del alldfs
gc.collect()
mod_dataf = pd.DataFrame()
dataf = pd.concat([dataf,ldt_ser],axis=1)
dataf.to_csv("outfile.txt", sep='|', quoting=3, escapechar='\' , index=False, header=False,encoding='utf-8')
''' Release Memory used by DataFrames '''
alldfs = [dataf]
del ldt_ser
del alldfs
gc.collect()
dataf = pd.DataFrame()
我使用垃圾收集器、del dataframe 并初始化以清除使用的内存,但仍然没有从 dataframe 释放总内存。 灵感来自
'''OUTPUT'''
1|infile.txt|1234567890|AAAAAAAAAA|04/10/2018
1|infile.txt|1234567890|BBBBBBBBBB|04/10/2018
1|infile.txt|1234567890|CCCCCCCCCC|04/10/2018
我遇到了和你一样的问题 我通过在 class 中以不同的方法拆分我的代码,找到了使用 gc.collect() 的解决方案。例如:
Class A:
def __init__(self):
# your code
def first_part_of_my_code(self):
# your code
# I want to clear my dataframe
del my_dataframe
gc.collect()
my_dataframe = pd.DataFrame() # not sure whether this line really helps
return my_new_light_dataframe
def second_part_of_my_code(self):
# my code
# same principle
所以当程序调用方法时,一旦程序离开方法,垃圾收集器就会清除内存。