fromfile
ungültige Daten und manchmal Segfault, wenn das Lesen über das Ende einer Datei hinausgeht, dh es wird nicht überprüft, ob das Lesen über das Dateiende hinausgeht. Dieses Problem führt unter Ubuntu 16.04 zu einem Segfault, unter OSX scheint es jedoch keinen Segfault zu geben.
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)
Prozess beendet mit Exit-Code 139 (unterbrochen durch Signal 11: SIGSEGV)
Plattform Linux - Python 3.6.6, pytest-3.8.2, py-1.6.0, pluggy-0.7.1
Nur zu beachten, reproduzierbar am 1.15.3. Ich denke, wir kennen die Größe, daher sollte dies nur einen Fehler auslösen oder die gesamte Datei lesen. Wenn dies auf einigen Systemen unbeaufsichtigt funktioniert, sollten wir für alle Fälle möglicherweise eine Versionshinweis einfügen (ich würde immer noch sagen, dass wir das Problem einfach beheben können).
BEARBEITEN: Ich würde eher Fehler machen, dachte nur, dass eine ganze Datei aufgrund der Indizierung eine Option sein könnte, aber die Indizierung ist in dieser Hinsicht etwas Besonderes.
Einverstanden, einen Fehler auszulösen, klingt nach einer guten Idee. Es gibt noch etwas zu sagen über Teillesungen, die auf zwei Arten gehandhabt werden können:
count
in fromfile
erreicht ist. Dann benötigen wir jedoch einen Mechanismus, um die tatsächliche Anzahl der gelesenen Datensätze (implizit) explizit zurückzugeben Dies sollte in der Form des resultierenden Arrays sichtbar sein. Ein Fehler kann weiterhin ausgelöst werden, da dies nicht das normale Verwendungsszenario ist.Ich weiß nicht, welche Szenarien besser zur Numpy-Philosophie passen, aber die erste Option klingt nützlicher.
Ich denke, ein Fehler ist am vernünftigsten. Was ich momentan nicht sicher bin, ist, ob fromfile dateiähnliche Objekte unterstützt, deren Größe nicht bekannt ist, oder was derzeit bei nicht leerem sep kwarg passiert.
@amuresan Der Code für fromfile ist in C, aber wenn Sie etwas Zeit haben, freuen wir uns immer sehr über Pull-Anfragen, und es scheint eine vernünftige Schwierigkeit zu sein, ein wenig in die C (Python) -API einzusteigen.
Ich glaube, das Problem hier ist tatsächlich, dass Sie auf Ubuntu ein MemoryError
, das falsch behandelt wird und den Segfault verursacht.
Eine PR mit einem Fix finden Sie hier: https://github.com/numpy/numpy/pull/12354
Hilfreichster Kommentar
Ich glaube, das Problem hier ist tatsächlich, dass Sie auf Ubuntu ein
MemoryError
, das falsch behandelt wird und den Segfault verursacht.Eine PR mit einem Fix finden Sie hier: https://github.com/numpy/numpy/pull/12354