DataFrame是一个重量级的数据结构,当一个dataframe比较大,占据较大内存的时候,同时又需要对这个dataframe做较复杂或者复杂度非O(1)的操作时,会由于内存占用过大而导致处理速度极速下降。
对此,我们的方法是尽量避免直接对过大的dataframe直接操作(当然有时候没有办法,必须对整体的dataframe进行操作,这时就需要从其他方面优化,比如尽量较少不必要的列,以降低内存消耗),以从csv文件读取数据为例,可以通过read_csv方法的chunksize参数,设定读取的行数,返回一个固定行数的迭代器,每次读取只消耗相应行数对应的dataframe的内存,从而可以有效的解决内存消耗过多的问题,参考如下demo。
import pandas as pd
df_iterator=pd.read_csv(file,chunksize=50000)
def process_dataframe(df):
pass
return processed_df
for index,df_tmp in enumerate(df_iterator):
df_processed=process_dataframe(df_tmp)
if index>0:
df_processed.to_csv(path)
else:
df_processed.to_csv(path,mode='a',header=False)
当然,以上只是一个例子,除了从csv文件读取,同样的从数据库读取或者从其他格式文件读取,也有chunksize参数,用法类似。并且chunksize的最优数值的设定也是不一定的,取决于列数的多少,你电脑内存的多少,以及数据格式,这个读者可以自己去尝试。