簡體   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