Numpy: Data tidak valid dan segfault saat membaca melewati ukuran file dengan fromfile di Ubuntu 16.04

Dibuat pada 31 Okt 2018  ·  4Komentar  ·  Sumber: numpy/numpy


fromfile data tidak valid dan terkadang segfault jika membaca melewati akhir file, yaitu tidak memeriksa apakah membaca akan melewati akhir file. Masalah ini mengarah ke segfault di Ubuntu 16.04, tetapi tampaknya tidak segfault di OSX.

Contoh kode reproduksi:

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)

Pesan eror:


Proses selesai dengan kode keluar 139 (terganggu oleh sinyal 11: SIGSEGV)

Informasi versi Numpy / Python:

platform linux - Python 3.6.6, pytest-3.8.2, py-1.6.0, pluggy-0.7.1

00 - Bug numpy.core

Komentar yang paling membantu

Saya percaya masalah di sini sebenarnya adalah bahwa di ubuntu Anda mendapatkan MemoryError yang ditangani secara tidak benar dan menyebabkan segfault.

PR dengan perbaikan ada di sini: https://github.com/numpy/numpy/pull/12354

Semua 4 komentar

Sekadar catatan, dapat direproduksi pada 1.15.3. Saya kira kita tahu ukurannya, jadi ini seharusnya hanya menimbulkan kesalahan, atau membaca seluruh file. Jika ini bekerja secara diam-diam pada beberapa sistem, mungkin kita harus meletakkan catatan rilis untuk berjaga-jaga (saya masih akan mengatakan kita bisa memperbaikinya).

EDIT: Saya cenderung error, hanya mengira seluruh file mungkin menjadi pilihan karena pengindeksan, tetapi pengindeksan agak istimewa dalam hal ini.

Setuju, memunculkan kesalahan sepertinya ide yang bagus. Masih ada yang bisa dikatakan tentang pembacaan parsial, yang dapat ditangani dengan dua cara:

  1. membaca catatan data sebanyak mungkin sampai akhir file atau count dalam fromfile tercapai, tapi kemudian kita membutuhkan mekanisme untuk mengembalikan secara eksplisit jumlah catatan yang dibaca (secara implisit ini harus terlihat dalam bentuk larik yang dihasilkan). Kesalahan masih bisa dimunculkan karena ini bukan skenario penggunaan normal.
  2. jangan izinkan pembacaan parsial yaitu naikkan jika ukuran yang akan dibaca tidak sesuai dengan sisa file.

Saya tidak tahu skenario mana yang lebih cocok dengan filosofi numpy, tetapi opsi pertama terdengar lebih berguna.

Saya pikir kesalahan paling masuk akal. Apa yang saya tidak yakin sekarang adalah jika fromfile mendukung file seperti objek yang tidak memiliki ukuran yang diketahui, atau apa yang saat ini terjadi dalam kasus sep kwarg yang tidak kosong.

@amuresan kode untuk fromfile ada di C, tetapi jika Anda punya sedikit waktu, kami selalu sangat senang dengan permintaan tarik, dan sepertinya kesulitan yang masuk akal untuk mencoba-coba sedikit ke dalam C (Python) API.

Saya percaya masalah di sini sebenarnya adalah bahwa di ubuntu Anda mendapatkan MemoryError yang ditangani secara tidak benar dan menyebabkan segfault.

PR dengan perbaikan ada di sini: https://github.com/numpy/numpy/pull/12354

Apakah halaman ini membantu?
0 / 5 - 0 peringkat