2014-09-12 121 views
1

我想加載一個使用熊貓的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 
  • 當試圖讀取包含的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線65K類似的文件,但使用「,」作爲分隔符,並得到與1和2中相同的錯誤。

  • 如果load_csv不是正確的方法,請您推薦一個合適的替代方法嗎?

  • +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

    回答

    1

    問題是舊的,但我希望別人可能會找到有用的答案。
    大數據量的大量的行和有限的數字的數據(比如幾十個上面)被優化(並且非常好)。你的情況似乎是相反的,所以它不是正確的工具。
    我會在將數據加載到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 
    ... 
    

    我相信這將是相當快......