代码之家  ›  专栏  ›  技术社区  ›  goks

如何清除熊猫的数据帧内存?

  •  2
  • goks  · 技术社区  · 7 年前

    我正在使用pandas read\u fwf方法将fixedwidth文件转换为分隔符文件(“|”分隔符)。我的输入文件(“infle.txt”)大约有16GB和990万条记录,而在创建outputfile之前,它占用了将近3倍的内存(大约48GB)。有没有人能帮我改进一下下面的逻辑,并通过某种方式了解这些额外内存的来源(我知道“seq\u id、fname和loaddatime将只占用几GB的空间”)。

    注: 我在循环中一个接一个地处理多个文件(大小相似的文件)。所以我必须在下一个文件接管之前清除内存。

    ''填充。txt“”'

    1234567890AAAAAAAAAA
    1234567890BBBBBBBBBB
    1234567890CCCCCCCCCC
    

    ''测试\u布局。csv“”'

    FIELD_NAME,START_POS,END_POS
    FIELD1,0,10
    FIELD2,10,20
    

    ''测试。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释放出总内存。 灵感来自 https://stackoverflow.com/a/49144260/2799214

    ''输出''

    1|infile.txt|1234567890|AAAAAAAAAA|04/10/2018
    1|infile.txt|1234567890|BBBBBBBBBB|04/10/2018
    1|infile.txt|1234567890|CCCCCCCCCC|04/10/2018
    
    1 回复  |  直到 7 年前
        1
  •  4
  •   Gilles Criton    6 年前

    我和你使用的问题一样 https://stackoverflow.com/a/49144260/2799214 我找到了一个使用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
    

    因此,当程序调用这些方法时,一旦程序离开该方法,垃圾收集器就会清除内存。