fromfile
données invalides et parfois segfault en cas de lecture au-delà de la fin d'un fichier, c'est-à-dire qu'il ne vérifie pas si la lecture va au-delà de la fin du fichier. Ce problème conduit à un segfault sur Ubuntu 16.04, mais ne semble pas segfault sur 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)
Processus terminé avec le code de sortie 139 (interrompu par le signal 11: SIGSEGV)
plateforme linux - Python 3.6.6, pytest-3.8.2, py-1.6.0, pluggy-0.7.1
Juste à noter, reproductible sur 1.15.3. Je suppose que nous connaissons la taille, donc cela devrait simplement générer une erreur ou lire le fichier entier. Si cela fonctionne silencieusement sur certains systèmes, nous devrions peut-être mettre une note de publication au cas où (je dirais toujours que nous pouvons simplement le réparer).
EDIT: J'aurais tendance à me tromper, je pensais juste que le fichier entier pourrait être une option en raison de l'indexation, mais l'indexation est un peu spéciale à cet égard.
D'accord, signaler une erreur semble être une bonne idée. Il y a encore quelque chose à dire sur les lectures partielles, qui pourraient être gérées de deux manières:
count
dans fromfile
est atteint, mais nous avons alors besoin d'un mécanisme pour renvoyer explicitement le nombre réel d'enregistrements qui ont été lus (implicitement cela doit être visible sous la forme du tableau résultant). Une erreur peut toujours être générée car ce n'est pas le scénario d'utilisation normal.Je ne sais pas quels scénarios correspondent le mieux à la philosophie numpy, mais la première option semble plus utile.
Je pense qu'une erreur est la plus raisonnable. Ce dont je ne suis pas sûr pour le moment, c'est si fromfile prend en charge les fichiers comme les objets qui n'ont pas une taille connue, ou ce qui se passe actuellement dans le cas de sep kwarg non vide.
@amuresan le code de fromfile est en C, mais si vous avez un peu de temps, nous sommes toujours très satisfaits des pull requests, et cela semble être une difficulté raisonnable de se plonger un peu dans l'API C (Python).
Je crois que le problème ici est en fait que sur ubuntu, vous obtenez un MemoryError
qui est mal géré et qui provoque l'erreur de segmentation.
Un PR avec un correctif est ici: https://github.com/numpy/numpy/pull/12354
Commentaire le plus utile
Je crois que le problème ici est en fait que sur ubuntu, vous obtenez un
MemoryError
qui est mal géré et qui provoque l'erreur de segmentation.Un PR avec un correctif est ici: https://github.com/numpy/numpy/pull/12354