python pandas 读取_csv 耗时太长
我正在尝试用pandas加载一个128MB的文件(我查了一下,发现它比用open或np.loadtxt快)。这个文件有1000行,每行包含65000个值,这些值要么是0,要么是1,中间用一个空格分开。
但不知为什么,这个过程花了很长时间,我搞不明白原因。对我来说,128MB听起来挺小的,而Matlab大约用了一分钟就能加载它。
这是我的(简单的)代码:
import os
import numpy as np
import pandas as pd
import time
DATA_DIR='D:\BinaryDescriptors3\ORBLearningIntermediatResults2'
TEST_DIR='yosemite_harris'
OUT_DIR='D:\BinaryDescriptors3\ORBLearningTripletsFinalResults'
PATCH_NUM=1000
data_filename=TEST_DIR+'_' + str(PATCH_NUM) + '_ORBresfile.txt'
data_filepath = os.path.join(DATA_DIR,data_filename)
s=time.time()
print "START"
data = pd.read_csv(data_filepath,delimiter=' ')
e=time.time()
print e-s
它从来没有执行到最后一行(我给了它30分钟,最后还是终止了)。为什么读取一个小的128MB文件会这么慢呢?
补充说明:
当我尝试用以下命令只读取一行时:
data = pd.read_csv(data_filepath, delimiter=' ', nrows=1)
我得到了以下错误:
Traceback (most recent call last):
File "C:\eclipse\plugins\org.python.pydev_3.7.1.201409021729\pysrc\pydevd.py", line 2090, in <module>
debugger.run(setup['file'], None, None)
File "C:\eclipse\plugins\org.python.pydev_3.7.1.201409021729\pysrc\pydevd.py", line 1547, in run
pydev_imports.execfile(file, globals, locals) # execute the script
File "D:\BinaryDescriptors3\Python\LearnTripletsOrb\LearnTripletsOrb.py", line 18, in <module>
data = pd.read_csv(data_filepath,delimiter=' ', nrows=1)
File "C:\Users\GilLevi\Anaconda\lib\site-packages\pandas\io\parsers.py", line 443, in parser_f
return _read(filepath_or_buffer, kwds)
File "C:\Users\GilLevi\Anaconda\lib\site-packages\pandas\io\parsers.py", line 231, in _read
return parser.read(nrows)
File "C:\Users\GilLevi\Anaconda\lib\site-packages\pandas\io\parsers.py", line 686, in read
ret = self._engine.read(nrows)
File "C:\Users\GilLevi\Anaconda\lib\site-packages\pandas\io\parsers.py", line 1130, in read
data = self._reader.read(nrows)
File "parser.pyx", line 727, in pandas.parser.TextReader.read (pandas\parser.c:7146)
File "parser.pyx", line 774, in pandas.parser.TextReader._read_low_memory (pandas\parser.c:7707)
StopIteration
当我尝试读取一个类似的文件,里面只有一行65K个字符时,我也得到了以下错误:
追溯(最近的调用在最前): 文件 "C:\eclipse\plugins\org.python.pydev_3.7.1.201409021729\pysrc\pydevd.py",第2090行,在 debugger.run(setup['file'], None, None) 文件 "C:\eclipse\plugins\org.python.pydev_3.7.1.201409021729\pysrc\pydevd.py",第1547行,在 run pydev_imports.execfile(file, globals, locals) # 执行脚本 文件 "D:\BinaryDescriptors3\Python\LearnTripletsOrb\LearnTripletsOrb.py",第20行,在 data = pd.read_csv(data_filepath, delimiter=' ', nrows=1) 文件 "C:\Users\GilLevi\Anaconda\lib\site-packages\pandas\io\parsers.py",第443行,在 parser_f return _read(filepath_or_buffer, kwds)
文件 "C:\Users\GilLevi\Anaconda\lib\site-packages\pandas\io\parsers.py",第231行,在 _read return parser.read(nrows) 文件 "C:\Users\GilLevi\Anaconda\lib\site-packages\pandas\io\parsers.py",第686行,在 read ret = self._engine.read(nrows) 文件 "C:\Users\GilLevi\Anaconda\lib\site-packages\pandas\io\parsers.py",第1130行,在 read data = self._reader.read(nrows) 文件 "parser.pyx",第727行,在 pandas.parser.TextReader.read (pandas\parser.c:7146) 文件 "parser.pyx",第774行,在 pandas.parser.TextReader._read_low_memory (pandas\parser.c:7707) StopIteration
我还尝试生成一个类似的文件,包含2行65K,但使用“,”作为分隔符,结果也得到了和1、2一样的错误。
如果load_csv不是正确的方法,能否请你推荐一个合适的替代方案?
1 个回答
这个问题虽然老旧,但我希望其他人能觉得这个答案有用。
Pandas(相对来说,NumPy就没那么强)在处理行数很多、列数有限(比如最多几十列)的数据时表现得非常好。如果你的情况正好相反,那就不太适合用这个工具了。
我会在把数据放进DataFrame之前先处理一下数据,然后在DataFrame中交换行和列,以便进行进一步处理。大致流程是这样的:
df = pd.DataFrame(columns=[i for i in range(len(txt))])
txt = open(data_filepath).readlines()
for i, ln in enumerate(txt):
row_items = ln.split()
df[i] = row_items
...
我觉得这样做会非常快……