質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

AWS Lambda

AWS Lambdaは、クラウド上でアプリを実行できるコンピューティングサービス。サーバーのプロビジョニングや管理を要せず複数のイベントに対してコードを実行します。カスタムロジック用いた他AWSサービスの拡張やAWSの規模やパフォーマンスを用いたバックエンドサービスを作成できます。

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Q&A

解決済

1回答

413閲覧

RubyはCSV読み込みが遅いですか?

DuhoKim

総合スコア4

CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

AWS Lambda

AWS Lambdaは、クラウド上でアプリを実行できるコンピューティングサービス。サーバーのプロビジョニングや管理を要せず複数のイベントに対してコードを実行します。カスタムロジック用いた他AWSサービスの拡張やAWSの規模やパフォーマンスを用いたバックエンドサービスを作成できます。

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

0グッド

0クリップ

投稿2020/01/31 04:50

前提・実現したいこと

  • 環境: AWS APIGateway, Lambda(言語はruby), csv用s3

LambdaのトリガーとしてAPI Gatewayを設定し、Lambdaの中ではs3からcsvファイルを読み込み,
検索を行ってレスポンスで結果を返します。

上記の処理を0.3秒ぐらいで終わらせたいです。
Lambdaのメモリを増やす以外の方法はないでしょうか、、

発生している問題・エラーメッセージ

この過程が2秒以上掛かってしまうのが問題です。
tsv(tab区切りのtxtファイルです)の大きさは3mbで5000行ぐらいです。
下記該当のソースコードのCSV.parseのところで2秒ぐらい掛かってるのはないかと思われます

該当のソースコード

ruby

1body = s3.bucket('bucket name').object('ファイルキー').get.body.string 2CSV.parse(body, col_sep: "\t")

試したこと

  • Lambdaのメモリが128mb(default)になっておりますが、メモリを増やしたら確かに早くなりました。
  • csvを読み込むのが遅いからLambdaのin memoryを利用するためglobal変数に指定しましたが、10分後には初期化されてました。
  • aws Athenaを使ってcsvにクエリを投げてみましたが、結局レスポンスまで2~3秒かかるのは同じでした。

補足情報(FW/ツールのバージョンなど)

  • rubyバージョンは2.5.0です

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

nanami12

2020/01/31 05:20

CSVをあつかうなら require "csv" CSV.foreach 略 等を使うのが常かと思うのですが
yu_1985

2020/01/31 06:43

Lambdaでない環境で同じ処理をするとどのくらいかかりますか?(メモリ量が違いすぎるので参考にならないかもしれませんが) 具体的な処理はわかりませんが、1行ずつ処理してるために余計に時間を食ってるような気がします。
DuhoKim

2020/01/31 06:50

コメントありがとうございます! @nanami12, CSV.foreachでも掛かる時間は同じでした。。 @yu_1985 ram8gbであるローカルでは一瞬で終わります。128mbと8GBは流石に差がありますね。。 parseは文字列をcsvに変換してくれるだけと思いましたが、裏では1行づつ処理しているのでしょうか?
yu_1985

2020/01/31 06:54

rubyのcsv操作についてそんなによく分かってるわけではないので正確なところはわかりませんが…。 全部を読み込まずに必要なところだけピンポイントで使う、みたいなことってできないんですかね?
DuhoKim

2020/01/31 07:15

必要なところだけ使うみたいなのができればいいですが、検索しても全然分からない状態ですね。。 S3 Selectは初めてみたのでそれで試してみます!ありがとうございます。
guest

回答1

0

自己解決

csvファイルを日付を基準で分割、保存しました。(366個のファイルに分割しました)
こうしたら5〜10倍以上早くなりました。
やはりcsvファイルが大きかったら時間もかかってしまうようです。

投稿2020/02/15 00:17

DuhoKim

総合スコア4

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問