我正在尝试获取csv(~10 GB)中特定列中的唯一值的数量,并且我正在寻找最快的方法。我希望像csvstat
这样的命令行工具比熊猫运行得更快,但是:
def get_uniq_col_count(colname):
df = pd.read_csv('faults_all_main_dp_1_joined__9-4-15.csv', engine='c', usecols=[colname], nrows = 400000)
df.columns = ['col']
return len(set(df.col.values)), list(set(df.col.values))
t1 = datetime.datetime.now()
count, uniq = get_uniq_col_count('model')
print(datetime.datetime.now() - t1)
# 0:00:04.386585
VS
$ time csvcut -c model faults_all_main_dp_1_joined__9-4-15.csv | head -n 400000 | csvstat --unique
3
real 1m3.343s
user 1m3.212s
sys 0m0.237s
(我正在做标题,因为我让csvstat
在整个数据集上运行,出去吃午饭,回来,它仍然在运行。花了pandas
50秒完成。)
我想知道我做错了什么,总的来说,如果有办法加速这个过程。 (每列有大约500万行可以读取。)
答案 0 :(得分:0)
这并不奇怪。 ' csvtools'完全用python编写,不使用任何优化技巧。特别是,' csvstat'将整个表读入内存并将其作为常规python列表存储多个副本。这会产生巨大的开销 - 包括内存和垃圾收集器时间。
另一方面,pandas使用numpy,这意味着整个列只使用了几个python对象,而且几乎没有内存开销。您可以通过使用特定于熊猫的独特方法(Find unique values in a Pandas dataframe, irrespective of row or column location)
使程序稍快一些如果您打算这么做,请将数据转换为更有效的格式。此页面:http://matthewrocklin.com/blog/work/2015/03/16/Fast-Serialization/表示如果您将数据转换为HDF5,则加载速度会快得多。