我获得了一个数据库" (更正确的是一个丑陋的巨大的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
加载最大值???我真的不知道。
答案 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())