2017-08-21 2 views
0

J'essaie de lire un fichier de 1,5 Go de s3 en utilisant des pandas & boto3 Aujourd'hui, j'ai dû faire pivoter un fichier de 36 Go de profondeur dans un fichier large (1,5 Go). J'ai écrit le fichier de 1,5 Go en local et vérifié si tout allait bien en utilisant pandas.read_csv(). Il a lu sans aucun problème. Mais après avoir copié en s3 lors de la lecture en utilisant boto3, les erreurs de code sont dues à une erreur de mémoire étrange. Le code fonctionne généralement bien pour les tailles de fichiers de 300 à 1 Go.erreur de mémoire lors de la lecture du fichier csv à partir de s3 en utilisant pandas & boto3. Erreur dans `python ': free(): pointeur invalide:

Je ne suis pas actuellement en mesure de déterminer exactement d'où provient l'erreur. J'ai essayé de copier à nouveau le fichier à s3 & toujours obtenir la même erreur de mémoire lors de la lecture.

Code

pour lire s3:

input_file_obj= s3.get_object(Bucket=bucket, Key=file) 
input_file_content= input_file_obj["Body"].read() 
df=pd.read_csv(io.BytesIO(input_file_content), index_col=None, delimiter=delim,header=hdr,low_memory=False) 

Je pense le bélier ne pouvait pas être la question, car il dispose de 32 Go de RAM disponible dans la machine EC2 que j'utilise. La machine sur laquelle je travaille est également Unix.

erreur Exemple:

*** Error in `python': free(): invalid pointer: 0x00007fd70340c3e4 *** 
======= Backtrace: ========= 
/lib64/libc.so.6(+0x7c503)[0x7fd71d737503] 
/home/user/anaconda3/lib/python3.6/site-packages/pandas/_libs/parsers.cpython-36m-x86_64-linux-gnu.so(parser_cleanup+0x1a)[0x7fd70340467a] 

link pour terminer le journal des erreurs

+1

Avez-vous la même erreur si dans 'read_csv' vous définissez' engine = 'python'' ou 'low_memory = True'? Un peu [googling] (https://github.com/tensorflow/tensorflow/issues/9328#issuecomment-296998879) suggère que cela peut avoir à faire avec des incompatibilités C, votre image EC2 peut avoir besoin d'une sorte de mise à jour si vous le souhaitez travailler tel quel. –

+0

@andrew_reece J'ai fatigué en donnant 'low_memory = False' et ça a marché comme un charme. J'ai référé la documentation de Google et de pandas mais cela ne m'a pas apporté beaucoup de lumière sur ce paramètre. Test actuellement tous les modules qui utilisent cette fonction pour voir si elle a un effet secondaire. Pourriez-vous expliquer la signification de ce paramètre en détail si vous êtes au courant? – stormfield

+0

La différence entre read from local et s3 était aussi la valeur de ce paramètre. C'est pourquoi je l'ai testé intially après l'avoir signalé. – stormfield

Répondre

0

La raison pour laquelle vous voyez cette erreur sur EC2/S3 mais ne peut pas être localement en raison de l'environnement C sur l'instance VM vous êtes en utilisant. Votre machine locale peut simplement avoir une configuration C plus compatible que celle fournie sur votre machine virtuelle.

Pour résoudre le problème, pensez à définir engine='python' ou low_memory=True dans read_csv(). Les arguments engine et low_memory dans read_csv() semblent tous deux impliquer l'implémentation C sous-jacente. Ce discussion a identifié une erreur similaire et a trouvé que c'était le problème. Juste avertissement: Je ne connais pas assez les Pandas pour parler avec confiance de la façon dont C fonctionne sous le capot. D'après les commentaires de l'OP, ces ajustements de valeurs de paramètres semblaient résoudre le problème, mais je serais heureux que quelqu'un avec plus d'expérience puisse intervenir ici.

+0

Désolé quand je voulais dire local je voulais dire 'lire depuis un chemin de stockage dans ec2' machine elle-même vs lire à partir de s3 en utilisant ec2 machine. Donc le 'low_memory = False' était à l'origine du problème avec s3 depuis sa lecture depuis le stockage local il était par défaut vrai. – stormfield

+0

Oh, je vois. Il semble que cela a à voir avec la façon dont l'analyseur Python C lit le compartiment S3. Pandas fait cela un peu différemment avec S3, comparé à la façon dont les fichiers locaux sont lus, voir la discussion [ici] (https://github.com/pandas-dev/pandas/pull/11073). Depuis que PR est entré, 'read_csv()' pour S3 ouvre une pipe vers S3 mais ne télécharge pas le tout en même temps.Cela peut être l'endroit où la configuration C sous-jacente rencontre un problème, basé sur la façon dont la mémoire est allouée lors de la lecture du flux. Meilleure estimation! –

+0

Selon le lien que vous avez partagé, je ne semble pas avoir quelque chose à voir avec stream-csv-from-s3. Permettez-moi d'essayer de lire à partir du stockage unix local avec low_memory = False pour voir si elles sont émises avec s3 seul ou pandas lui-même. – stormfield