蟒蛇熊猫read_csv永恒

问题描述:

我想加载一个使用熊猫的128MB文件(谷歌搜索后,我发现它比打开或np.loadtxt快)。该文件有1000行,每行包含由单个空格分隔的0或1的65K值。蟒蛇熊猫read_csv永恒

由于某些原因,它需要很长的时间,我不知道为什么。 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,分隔符=””,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,运行中 pydev_imports.execfile(文件,全局变量,本地文件)#执行脚本 文件”D:\ BinaryDescriptors3 \ Python \ LearnTripletsOrb \ LearnTripletsOrb.py“,第20行,在 data = pd.read_csv(data_filepath,delimiter ='', NROWS = 1) 文件 “C:\用户\ GilLevi \阿纳康达\ lib中\站点包\大熊猫\ IO \ parsers.py”,线路443,在parser_f 返回_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行,在读 ret = self._engine.read(nrows) 文件”C:\ Users \ GilLevi \ Anaconda \ lib \ site-packages \ pandas \ iO \ parsers.py“,第1130行,在读 data = self._reader.read(nrows) pandas.parser.TextReader.read(pandas \ parser.c:7146)中的文件”parser.pyx“,第727行) 文件 “parser.pyx”,线路774,在pandas.parser.TextReader._read_low_memory(熊猫\ parser.c:7707) 的StopIteration

  2. 我也试图生成包含2线65K类似的文件,但使用“,”作为分隔符,并得到与1和2中相同的错误。

  3. 如果load_csv不是正确的方法,请您推荐一个合适的替代方法吗?

开始=“2”>
+0

你有没有试过在一个较小的文件,说只是1号线? – 2014-09-12 19:12:27

+0

根据你想要对数据做什么,你可以尝试另一种方法;您描述的格式听起来不像典型的CSV。 – 2014-09-12 19:16:02

+0

阅读单行需要多长时间? :'data = pd.read_csv(data_filepath,delimiter ='',nrows = 1)' – EdChum 2014-09-12 20:21:07

问题是旧的,但我希望别人可能会找到有用的答案。
大数据量的大量的行和有限的数字的数据(比如几十个上面)被优化(并且非常好)。你的情况似乎是相反的,所以它不是正确的工具。
我会在将数据加载到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 
... 

我相信这将是相当快......