我正在尝试使用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小文件需要这么长时间?
编辑:
尝试使用以下命令只读取一行时:
data = 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
当尝试读取只包含一行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行65K,但使用“,”作为分隔符,并得到与1和2中相同的错误。
如果load_csv不是正确的方法,您能否推荐一个合适的替代方案?
答案 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;
}
我相信这会很快......