繁体   English   中英

python pandas read_csv 需要永远

[英]python pandas read_csv taking forever

我正在尝试使用 panda 加载一个 128MB 的文件(谷歌搜索后我发现它比 open 或 np.loadtxt 快)。 该文件有 1000 行,每行包含 65K 个值,这些值是 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. 尝试使用以下命令仅读取一行时:

    数据 = 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) File "C:\\eclipse\\plugins\\org.python.pydev_3.7.1.201409021729\\pysrc\\pydevd.py", line 1547, in 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-包\\pandas\\io\\parsers.py”,第 443 行,在 parser_f 中返回 _read(filepath_or_buffer, kwds)

    文件“C:\\Users\\GilLevi\\Anaconda\\lib\\site-packages\\pandas\\io\\parsers.py”,第 231 行,在 _read 中返回 parser.read(nrows) 文件“C:\\Users\\GilLevi\\Anaconda\\lib \\site-packages\\pandas\\io\\parsers.py",第 686 行,在读取 ret = self._engine.read(nrows) 文件 "C:\\Users\\GilLevi\\Anaconda\\lib\\site-packages\\pandas\\io\\ parser.py”,第 1130 行,在读取数据 = 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 不是正确的方法,你能推荐一个合适的替代方法吗?

这个问题很老,但我希望其他人可能会发现答案有用。
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
...

我相信这会非常快......

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM