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)
платформа Linux - Python 3.6.6, pytest-3.8.2, py-1.6.0, pluggy-0.7.1
Обратите внимание, воспроизводится на 1.15.3. Думаю, мы знаем размер, поэтому это должно просто вызвать ошибку или прочитать весь файл. Если в некоторых системах это работает незаметно, возможно, нам стоит на всякий случай добавить примечание к выпуску (я все же сказал бы, что мы можем просто исправить это).
РЕДАКТИРОВАТЬ: Я склонен к ошибке, просто подумал, что весь файл может быть вариантом из-за индексации, но индексирование в этом отношении немного особенное.
Согласен, сообщение об ошибке - хорошая идея. Еще есть что сказать о частичном чтении, которое можно обрабатывать двумя способами:
count
в fromfile
, но тогда нам нужен механизм для явного возврата фактического количества прочитанных записей (неявно это должно быть видно в форме результирующего массива). Ошибка может возникнуть, потому что это не обычный сценарий использования.Я не знаю, какие сценарии лучше подходят для философии numpy, но первый вариант кажется более полезным.
Я думаю, что ошибка является наиболее разумной. В чем я не уверен прямо сейчас, так это в том, поддерживает ли fromfile объекты типа file, которые не имеют известного размера, или что в настоящее время происходит в случае непустого sep kwarg.
@amuresan код fromfile находится на C, но если у вас есть немного времени, мы всегда очень довольны запросами на вытягивание, и кажется разумной трудностью немного поработать с C (Python) API.
Я считаю, что проблема здесь на самом деле в том, что на ubuntu вы получаете MemoryError
, который обрабатывается неправильно и вызывает segfault.
PR с исправлением здесь: https://github.com/numpy/numpy/pull/12354
Самый полезный комментарий
Я считаю, что проблема здесь на самом деле в том, что на ubuntu вы получаете
MemoryError
, который обрабатывается неправильно и вызывает segfault.PR с исправлением здесь: https://github.com/numpy/numpy/pull/12354