如何以更优雅的方式和低内存消耗来改进代码?

时间:2015-08-11 15:40:14

标签: python-2.7 pandas

我有一个数据集,其维度大约是2,000(行)x 120,000(列)。

我想选择某些专栏(约8,000列)。

因此文件维度为2,000(行)x 8,000(列)。

这是一个好人写的代码(我从stackoverflow搜索但很抱歉我忘了他的名字)。

import pandas as pd

df = pd.read_csv('...mydata.csv') 

my_query = pd.read_csv('...myquery.csv')

df[list['Name'].unique()].to_csv('output.csv')

但是,结果在我的控制台中显示 MemoryError ,这意味着代码可能无法正常运行。

那么有没有人知道如何用更有效的方式来选择某些列来改进代码?

感谢您的帮助,

1 个答案:

答案 0 :(得分:1)

我想我找到了你的source

所以,我的解决方案使用带有参数的read_csv

  1. iterator=True - 如果为True,则返回TextFileReader以启用将文件逐段读入内存
  2. chunksize=1000 - 用于将文件“分块”为多个行的行数。将导致返回TextFileReader个对象
  3. usecols=subset - 要返回的列子集,可以大大加快解析时间并降低内存使用量
  4. Source

    我使用usecols过滤大型数据集 - 我只使用数据集(2 000,8 000)(2 000,120 000)。

    import pandas as pd
    
    #read subset from csv and remove duplicate indices
    subset = pd.read_csv('8kx1.csv', index_col=[0]).index.unique()
    print subset
    
    #use subset as filter of columns
    tp = pd.read_csv('input.csv',iterator=True, chunksize=1000, usecols=subset) 
    df = pd.concat(tp, ignore_index=True)
    
    print df.head()
    print df.shape
    
    #write to csv 
    df.to_csv('output.csv',iterator=True, chunksize=1000)
    

    我使用此代码段进行测试:

    import pandas as pd
    import io
    
    temp=u"""A,B,C,D,E,F,G
            1,2,3,4,5,6,7"""
    
    temp1=u"""Name
    B
    B
    C
    B
    C
    C
    E
    F"""
    
    subset = pd.read_csv(io.StringIO(temp1), index_col=[0]).index.unique()
    print subset
    
    #use subset as filter of columns
    df = pd.read_csv(io.StringIO(temp), usecols=subset)
    
    print df.head()
    print df.shape