2017-08-21 18 views
0

pandasを使ってs3から1.5 GBのファイルを読み込もうとしています& boto3 今日、私は36 GBの深いファイルを広いファイル(1.5 GB)にピボットさせなければなりませんでした。 1.5GBのファイルをローカルに書き、pandas.read_csv()を使ってすべてが正常かどうかを確認しました。それは何の問題もなく読んだ。pandas&boto3を使用してs3からcsvファイルを読み取っているときにメモリエラーが発生しました。 Pythonのエラー:free():無効なポインタ:

しかし、boto3を使用して読み込み中にs3にコピーした後、奇妙なメモリエラーのためにコードエラーが発生します。このコードは通常、300〜1 GBのファイルサイズで正常に動作します。

現在、正確にエラーが発生している箇所を特定できません。私は、同じメモリエラーを読み込み中にs3 &に再度ファイルをコピーしようとしました。 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) 

私はそれが私が使用していEC2のマシンで利用可能なRAMの32 GB単位を持っているので、問題になることができませんでしたラムを考えています。また私が取り組んでいるマシンはUnixです。

サンプルエラー:

*** 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エラーログ

+1

'read_csv'に' engine = 'python''や 'low_memory = True'を設定しても同じエラーが出ますか?ちょっとした(グーグル)(https://github.com/tensorflow/tensorflow/issues/9328#issuecomment-296998879)は、これがCの非互換性と関係している可能性があることを示唆しています。EC2イメージは、そのままの状態で作業してください。 –

+0

@andrew_reece私は 'low_memory = False'を与えるのに疲れて、魅力的に機能しました。私はGoogleとpandasのドキュメントを参照しましたが、このパラメータについてはあまり気にしません。現在、この機能を使用するすべてのモジュールをテストし、副作用があるかどうかを確認します。 – stormfield

+0

また、ローカルとs3からの読み取りの違いは、この1つのパラメータの値です。だから私があなたがそれを指摘した後、それを最初にテストしたのです。 – stormfield

答えて

0

あなたがEC2/S3にこのエラーが表示さではなく、ローカルに起因するVMインスタンス上のC環境になることがありますしている理由を完了するためにを使用して。あなたのローカルマシンは、あなたのVMにバンドルされているものよりも、より互換性のあるCセットアップを持つだけかもしれません。

engine='python'またはlow_memory=Trueread_csv()に設定することを検討してください。 enginelow_memoryの両方の引数がread_csv()にあると、根底にあるCの実装に関与しているようです。このdiscussionは同様のエラーを特定し、それが問題であることがわかりました。

公正な警告:私はパンダがボンネットの下でCとどのように機能するかについて自信を持って話すには十分に精通していません。 OPのコメントによると、これらのパラメータ値の調整は問題を解決するように思われましたが、私はここでチャイムをするより多くの経験を持つ方を歓迎します。

+0

申し訳ありませんが、私は地元の私が 'ec2マシンのストレージパスから読み取る'を意味していました。だから 'low_memory = False'はs3の問題を引き起こしていました。なぜならローカルストレージからの読み込みはデフォルトで真だったからです。 – stormfield

+0

ああ、そうだ。これは、Python CパーサーがS3バケットをどのように読み込むかと関係しているようです。 Pandasは、ローカルファイルがどのように読み込まれているかと比べて、S3と少し違っています。議論[here](https://github.com/pandas-dev/pandas/pull/11073)を参照してください。そのPRが入ってから、S3の 'read_csv()'はS3へのパイプを開きますが、すべてを一度にダウンロードするわけではありません。これは、ストリームから読み込むときにメモリがどのように割り当てられるかに基づいて、基本となるC構成が問題になる場所です。最良の推測! –

+0

リンクが共有されているごとに、私はstream-csv-from-s3と何も関係していないようです。 low_memory = Falseを使ってローカルのUNIXストレージから読み込み、s3だけかpandas自体かを確認してみましょう。 – stormfield

関連する問題