Python / Pandas:我如何阅读700万条记录?

时间:2017-06-27 15:03:41

标签: python pandas

我获得了一个数据库" (更正确的是一个丑陋的巨大的CSV文件),其中包含"发现的结果"处理。我得到的行很短,它们是关于超过65,000台计算机上的许可的信息,它看起来像:

10/02/2017 09:14:56 a.m.;0000GATMEX39388; ;Microsoft Office Publisher MUI (Spanish) 2010;14.0.7015.1000;20150722;Microsoft Corporation
10/02/2017 09:14:56 a.m.;0000GATMEX39388; ;Microsoft Office Outlook MUI (Spanish) 2010;14.0.7015.1000;20160216;Microsoft Corporation
10/02/2017 09:14:56 a.m.;0000GATMEX39388; ;Microsoft Office Groove MUI (Spanish) 2010;14.0.7015.1000;20150722;Microsoft Corporation
10/02/2017 09:14:56 a.m.;0000GATMEX39388; ;Microsoft Office Word MUI (Spanish) 2010;14.0.7015.1000;20151119;Microsoft Corporation

如您所见,是一个以分号分隔的文件,它有进程运行的时间,PC的ID,空白(我不知道它是什么),程序和版本程序,有更多的领域,但我不关心它们,只有那些是相关的。

所以我转向Pandas做一些分析(基本上是计数),并获得3M记录。问题是,这个文件超过7M记录(我使用Notepad ++ 64bit查看它)。那么,我如何使用Pandas来分析具有如此多记录的文件呢?

我使用的是Python 3.5,Pandas 0.19.2

为Fabio的评论添加信息:

我正在使用:

df = pd.read_csv("inventario.csv", delimiter=";", 
                 header=None, usecols=[0,1,2,3,4], 
                 encoding="latin_1")

非常精确:文件为7' 432,175行,Pandas只访问3' 172,197。奇怪的是,如果我将文件加载到Excel 2017(使用数据查询),它将正好加载3' 172,197行。

编辑: 评论结束后,我检查了文件,发现有些线路已损坏(大约450个),我不知道它们是否发出信号并且文件结束,它看起来并不是这样,反正我清理了错误形成的线条,仍然只有大约3M线的Pandas。

修改

好的,我解决了这个问题,但是真的,帮助我理解我做错了什么。我不能做像我这样做的事情......首先,我清理了文件"奇怪"线条,它们大约有500个,然后我将文件保存到 inv.csv

然后我做了以下事情:

f_inventario = open("inv.csv", "r", encoding="latin1")
f_inventario.readlines()
f_inventario.close()

df = pd.DataFrame(lines)

df.columns = ['data']

df['fecha']    = df.data.apply(lambda s : s.split(';')[0])
df['equipo']   = df.data.apply(lambda s : s.split(';')[1])
df['software'] = df.data.apply(lambda s : s.split(';')[2])
df['version']  = df.data.apply(lambda s : s.split(';')[3][:-1])

df.drop(['data'], axis=1, inplace=True)

现在我用7M行获取了我的数据帧。如果我做了df=pd.read_csv('inv.csv' ... ),它只会读到3M记录。

我的问题解决了,但这很可怕,这不是应该如何。我认为这不是记忆问题。可能是一些全局变量告诉read_csv加载最大值???我真的不知道。

1 个答案:

答案 0 :(得分:1)

如果性能不是问题,那么简单的方法就是将文件逐行读入缓冲区。缓冲区已满后,分析缓冲区中的数据。迭代地继续,直到您处理完整个文件。完成后,您可以聚合每个块的结果以形成最终结果。为了加快速度,您可以查看内存映射等内容,例如

import mmap
with open("hello.txt", "r+") as f:
    # memory-map the file, size 0 means whole file
    map = mmap.mmap(f.fileno(), 0)
    # read content via standard file methods
    print(map.readline())

see this thread