蟒蛇熊猫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文件需要这么长时间?
编辑:
-
当试图使用下面的命令来读取只有一行:
数据= 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不是正确的方法,请您推荐一个合适的替代方法吗?
问题是旧的,但我希望别人可能会找到有用的答案。
大数据量的大量的行和有限的数字的数据(比如几十个上面)被优化(并且非常好)。你的情况似乎是相反的,所以它不是正确的工具。
我会在将数据加载到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
...
我相信这将是相当快......
你有没有试过在一个较小的文件,说只是1号线? – 2014-09-12 19:12:27
根据你想要对数据做什么,你可以尝试另一种方法;您描述的格式听起来不像典型的CSV。 – 2014-09-12 19:16:02
阅读单行需要多长时间? :'data = pd.read_csv(data_filepath,delimiter ='',nrows = 1)' – EdChum 2014-09-12 20:21:07