fromfile
无效数据,如果读取超过文件末尾有时会出现段错误,即它不检查读取是否会超过文件末尾。 此问题导致在Ubuntu 16.04上出现段错误,但在OSX上似乎不存在段错误。
import numpy as np
def test_read_from_file():
# create an empty file named `empty.bin`
filename = 'empty.bin'
open(filename, 'a').close()
# read large chunk of data, past the end of the file
dtype = [('data', '<f4', 500,)]
count = 100000000
with open(filename, 'rb') as fh:
data = np.fromfile(fh, dtype, count)
print(data.shape)
退出代码为139的过程完成(被信号11:SIGSEGV中断)
平台linux-Python 3.6.6,pytest-3.8.2,py-1.6.0,pluggy-0.7.1
只是要注意,可在1.15.3上重现。 我想我们知道大小了,所以这只会引发错误或读取整个文件。 如果这在某些系统上无声工作,也许我们应该放个发行说明,以防万一(我仍然会说我们可以修复它)。
编辑:我倾向于出错,只是因为索引而认为整个文件可能是一个选项,但是索引在这方面有点特殊。
同意,提出错误听起来像是个好主意。 关于部分读取还有一些要说的地方,可以通过两种方式处理:
fromfile
的count
,但是我们需要一种机制来显式返回已读取的实际记录数(隐式地)这应该在结果数组的形状中可见)。 由于这不是正常的使用情况,因此仍然可能引发错误。我不知道哪种方案更适合numpy哲学,但第一种选择听起来更有用。
我认为错误是最合理的。 我现在不确定的是fromfile是否支持文件大小不一样的对象,或者在非空sep kwarg情况下当前会发生什么。
@amuresan fromfile的代码在C中,但是如果您有一点时间,我们对拉取请求总是很高兴,并且稍微涉足C(Python)API似乎是一个相当困难。
我相信这里的问题实际上是在ubuntu上您获得了错误处理的MemoryError
,并导致了段错误。
带有修复的PR在这里: https :
最有用的评论
我相信这里的问题实际上是在ubuntu上您获得了错误处理的
MemoryError
,并导致了段错误。带有修复的PR在这里: https :