2016-04-07 19 views
1

aws-sdk gemを使用して、AWS S3に保存されているCSVファイルを読み取っています。S3に格納されたCSVファイルを解析するための推奨されるアプローチは何ですか?

AWS docを参照してください。これまでのところ、私が持っている:PRYで

Aws::S3::Resource.new.bucket(ENV['AWS_BUCKET_NAME']).object(s3_key).get({ response_target: "#{Rails.root}/tmp/items.csv" }) 

を、これが返されます。

output error: #<IOError: closed stream> 

をしかし、tmp/に移動します。 items.csvファイルが表示され、適切なコンテンツが含まれています。戻り値が実際のエラーであるかどうかはわかりません。

私の心配です。一時ファイルを"#{Rails.root}/tmp/"に保存しても問題ありませんか?

もう1つのアプローチを検討する必要がありますか?

ファイルをメモリにロードしてからCSV.parseにロードできます。 CSVファイルが巨大な場合、これは意味を持ちますか?

+0

「CSVファイルが巨大であれば、これは意味がありますか?」もちろん。スケーラビリティは非常に重要です。特に共有ホストで親切であり、他のホストとのやりとりが必要な場合は特に重要です。ファイル全体をスラーする 'read'ではなく、行単位のファイル読み取りを使用します。 –

+0

@theTinMan "line-by-line-file-read"には何をお勧めしますか? –

+0

[CSVクラスのドキュメント](http://ruby-doc.org/stdlib-2.3.0/libdoc/csv/rdoc/CSV.html)には、CSVファイルの読み書きにさまざまなバリエーションがあります。 –

答えて

1

aws gemを使用して同期してファイルオブジェクトを返す方法がわかりません。

しかし、私があなたが言及した他の話題に関するいくつかのアドバイスを提供することができます。

まず、/ tmp - 私はここでファイルを保存することが有効な方法であることを発見しました。 AWSでは、このディレクトリを使用してS3格納イメージのローカルLRUキャッシュを作成しました。重要なことは、ファイルが自動的に削除された状況を先取りすることです。この場合、ファイルを再設定する必要があります。ちなみに、Herokuは「読み取り専用ファイルシステム」を持っていますが、/ tmpに書き込むことはできます。

第2の部分は、ファイルオブジェクトを同期的に返す問題です。 S3宝石を使ってこれを行うことは可能かもしれませんが、私はopen-urimechanizeのようなものを使ってHTTP経由で成功裏に取り出すことができました。公的に利用可能なアセットではないと思われる場合は、S3へのアクセス権を変更してサーバーへのアクセスを制限することができます。

+0

'Tempfile.new'はどうですか?したがって、例えば、 'temp_file = Tempfile.new( 'items.scv'); s3.bucket(ENV ['AWS_BUCKET_NAME'])。オブジェクト(s3_key).get({response_target:temp_file.path}) '。 OSの一時ディレクトリとアプリケーションレベルのファイルを保存します。 ' –

+0

「Tempfile.new」は実際に私が使用しているものですが、OSとアプリケーションレベルの区別はできませんでした。あなたのコードに関して - それをテストするのが最善のことです。それは動作しますか? –

+0

Yeap、 'Tempfile'アプローチが有効です。私は "HTTP経由でそれをフェッチする"代替策を念頭に置いておくつもりだ –

関連する問題