python pandas 读取_csv 耗时太长

4 投票
1 回答
10182 浏览
提问于 2025-04-21 09:09

我正在尝试用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文件会这么慢呢?

补充说明:

  1. 当我尝试用以下命令只读取一行时:

    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
  1. 当我尝试读取一个类似的文件,里面只有一行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. 我还尝试生成一个类似的文件,包含2行65K,但使用“,”作为分隔符,结果也得到了和1、2一样的错误。

  3. 如果load_csv不是正确的方法,能否请你推荐一个合适的替代方案?

1 个回答

6

这个问题虽然老旧,但我希望其他人能觉得这个答案有用。
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
...

我觉得这样做会非常快……

撰写回答