蟒蛇熊猫read_csv永远

时间:2014-09-12 19:05:58

标签: python pandas

我正在尝试使用panda加载128MB文件(在谷歌搜索之后我发现它比open或np.loadtxt更快)。该文件有1000行,每行包含由单个空格分隔的0或1的65K值。

由于某种原因,它需要很长时间,我无法弄清楚为什么。 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)

  2. 我收到以下错误:

    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行,in     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行,in     data = pd.read_csv(data_filepath,delimiter ='',nrows = 1) 在parser_f中的文件“C:\ Users \ GilLevi \ Anaconda \ lib \ site-packages \ pandas \ io \ parsers.py”,第443行     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行,正在阅读     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中文件“parser.pyx”,第727行(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 个答案:

答案 0 :(得分:2)

这个问题已经过时了,但我希望其他人可能会觉得答案很有用。
在处理充足行的数据时,Pandas(不那么NumPy)经过优化(非常好)并且数量有限的列(例如,几十个顶部)。您的情况似乎正好相反,因此它不适合执行任务 我会在将数据加载到DataFrame之前对数据进行预处理,然后我会在DataFrame中交换列和行以进行进一步处理。所以它是这样的:

#columns {
    column-width: 320px;
    column-gap: 15px;
    width: 90%;
    max-width: 1100px;
    margin: 50px auto;
}

div#columns figure {
    background: #fefefe;
    border: 2px solid #fcfcfc;
    box-shadow: 0 1px 2px rgba(34, 25, 25, 0.4);
    margin: 0 2px 15px;
    padding: 15px;
    padding-bottom: 10px;
    transition: opacity .4s ease-in-out;
    display: inline-block;
    column-break-inside: avoid;
}

div#columns figure img {
    width: 100%; height: auto;
    border-bottom: 1px solid #ccc;
    padding-bottom: 15px;
    margin-bottom: 5px;
}

我相信这会很快......