Numpy: Неверные данные и segfault при чтении за пределами размера файла с fromfile в Ubuntu 16.04

Созданный на 31 окт. 2018  ·  4Комментарии  ·  Источник: numpy/numpy


fromfile недопустимые данные и иногда ошибка segfault при чтении за пределами конца файла, т.е. не проверяет, будет ли чтение за пределами конца файла. Эта проблема приводит к segfault в Ubuntu 16.04, но, похоже, не к segfault в 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 , который обрабатывается неправильно и вызывает segfault.

PR с исправлением здесь: https://github.com/numpy/numpy/pull/12354

Все 4 Комментарий

Обратите внимание, воспроизводится на 1.15.3. Думаю, мы знаем размер, поэтому это должно просто вызвать ошибку или прочитать весь файл. Если в некоторых системах это работает незаметно, возможно, нам стоит на всякий случай добавить примечание к выпуску (я все же сказал бы, что мы можем просто исправить это).

РЕДАКТИРОВАТЬ: Я склонен к ошибке, просто подумал, что весь файл может быть вариантом из-за индексации, но индексирование в этом отношении немного особенное.

Согласен, сообщение об ошибке - хорошая идея. Еще есть что сказать о частичном чтении, которое можно обрабатывать двумя способами:

  1. читать как можно больше записей данных до конца файла или до достижения count в fromfile , но тогда нам нужен механизм для явного возврата фактического количества прочитанных записей (неявно это должно быть видно в форме результирующего массива). Ошибка может возникнуть, потому что это не обычный сценарий использования.
  2. не разрешать частичное чтение, т.е. повышать, если размер для чтения не умещается в остальной части файла.

Я не знаю, какие сценарии лучше подходят для философии numpy, но первый вариант кажется более полезным.

Я думаю, что ошибка является наиболее разумной. В чем я не уверен прямо сейчас, так это в том, поддерживает ли fromfile объекты типа file, которые не имеют известного размера, или что в настоящее время происходит в случае непустого sep kwarg.

@amuresan код fromfile находится на C, но если у вас есть немного времени, мы всегда очень довольны запросами на вытягивание, и кажется разумной трудностью немного поработать с C (Python) API.

Я считаю, что проблема здесь на самом деле в том, что на ubuntu вы получаете MemoryError , который обрабатывается неправильно и вызывает segfault.

PR с исправлением здесь: https://github.com/numpy/numpy/pull/12354

Была ли эта страница полезной?
0 / 5 - 0 рейтинги