Numpy: 在Ubuntu 16.04上使用fromfile读取超过文件大小的数据时,数据和段错误无效

创建于 2018-10-31  ·  4评论  ·  资料来源: numpy/numpy


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中断)

Numpy / Python版本信息:

平台linux-Python 3.6.6,pytest-3.8.2,py-1.6.0,pluggy-0.7.1

00 - Bug numpy.core

最有用的评论

我相信这里的问题实际上是在ubuntu上您获得了错误处理的MemoryError ,并导致了段错误。

带有修复的PR在这里: https :

所有4条评论

只是要注意,可在1.15.3上重现。 我想我们知道大小了,所以这只会引发错误或读取整个文件。 如果这在某些系统上无声工作,也许我们应该放个发行说明,以防万一(我仍然会说我们可以修复它)。

编辑:我倾向于出错,只是因为索引而认为整个文件可能是一个选项,但是索引在这方面有点特殊。

同意,提出错误听起来像是个好主意。 关于部分读取还有一些要说的地方,可以通过两种方式处理:

  1. 读取尽可能多的数据记录,直到达到文件末尾或fromfilecount ,但是我们需要一种机制来显式返回已读取的实际记录数(隐式地)这应该在结果数组的形状中可见)。 由于这不是正常的使用情况,因此仍然可能引发错误。
  2. 不允许部分读取,即如果要读取的大小不适合文件的其余部分,则提高。

我不知道哪种方案更适合numpy哲学,但第一种选择听起来更有用。

我认为错误是最合理的。 我现在不确定的是fromfile是否支持文件大小不一样的对象,或者在非空sep kwarg情况下当前会发生什么。

@amuresan fromfile的代码在C中,但是如果您有一点时间,我们对拉取请求总是很高兴,并且稍微涉足C(Python)API似乎是一个相当困难。

我相信这里的问题实际上是在ubuntu上您获得了错误处理的MemoryError ,并导致了段错误。

带有修复的PR在这里: https :

此页面是否有帮助?
0 / 5 - 0 等级

相关问题

inducer picture inducer  ·  3评论

astrofrog picture astrofrog  ·  4评论

marcocaccin picture marcocaccin  ·  4评论

qualiaa picture qualiaa  ·  3评论

perezpaya picture perezpaya  ·  4评论