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.
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)
Proses selesai dengan kode keluar 139 (terganggu oleh sinyal 11: SIGSEGV)
platform linux - Python 3.6.6, pytest-3.8.2, py-1.6.0, pluggy-0.7.1
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:
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.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
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