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

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

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

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

Ruby

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

RubyMine

RubyMineは、Ruby/Ruby on RailsベースのWebアプリケーション開発を行うためのIDEです。コードエディタやコードアシスタンス、グラフィカルなデバッガを搭載しており、様々なバージョン管理システムに対応しています。

Q&A

解決済

2回答

2437閲覧

CSVファイルの読み込み、”[FATAL] failed to allocate memory”

退会済みユーザー

退会済みユーザー

総合スコア0

CSV

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

Ruby

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

RubyMine

RubyMineは、Ruby/Ruby on RailsベースのWebアプリケーション開発を行うためのIDEです。コードエディタやコードアシスタンス、グラフィカルなデバッガを搭載しており、様々なバージョン管理システムに対応しています。

0グッド

0クリップ

投稿2018/07/21 04:37

RybyMineでCSVファイルを読み込もうとしていますが、次のようなエラーが出てしまいます。

”[FATAL] failed to allocate memory”

PCのメモリ容量が少ないせいだと思い、メモリ8GBのVPSをレンタルし同様なことを試しましたが、
やはり同じエラーが出てしましました。

CSVファイルのサイズを変えて試したところ次の様になりました。
-CSVファイルのサイズ:40,000KB (5万行/100列) -> 処理可能
-CSVファイルのサイズ:60,000KB (7万行/100列) -> エラーで処理不可

この場合の処理としてDBMクラスを使うしかないのでしょうか?
DBMクラスは少しハードルが高いように感じ初心者には難しいかと思っております。。

サンプルコードなど教えて頂けるとありがたいです。

ruby

1require 'csv' 2 3kakaku= Hash.new{|h,k| h[k]=[]} 4CSV.foreach("data/all.csv", headers: true) do |row| 5 kakaku[row["Timestamp"]] << row 6end 7 8search = "20190101" 9put kakaku[search] 10 11# このれを実行すると[FATAL] failed to allocate memory”になる

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

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

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

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

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

guest

回答2

0

ベストアンサー

kakaku = GDBM.open('filename', 0664, GDBM::NEWDB)
すれば、以降は、キー、データともに文字列でなければならないという制限付きで、kakaku = {}したのと同じように使えます。キーはともかく、データが文字列という制限は面倒ですね。

また、{|h,k| h[k]=[]}相当の機能は無い(未定義値はnil固定)ので、その考慮も必要。

文字列との相互変換はMarshalを使いました。機械的に書き直せるので、難しくはないです。

Ruby

1require "gdbm" 2require "csv" 3 4kakaku = GDBM.open("filename",0664,GDBM::NEWDB) 5 6CSV.foreach("data/all.csv", headers: true) do |row| 7 key = row["Timestamp"] 8 kakaku[key] ||= Marshal.dump([]) 9 kakaku[key] = Marshal.dump( Marshal.load(kakaku[key]) << row ) 10end 11 12search = "20190101" 13p Marshal.load( kakaku[search] )

投稿2018/07/21 09:28

otn

総合スコア84421

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

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

退会済みユーザー

退会済みユーザー

2018/07/22 04:03

ありがとうございます!無事にやりたいことができ、問題なく動作しました。 理解のために確認させていただきたいのですが、 ”Marshal”を使う意味は、データベースは文字列にしか対応していないので、参照データを文字列に固定するため、でしょうか? また、GDBM.open("filename",0664,GDBM::NEWDB)の ”0664” は何の命令でしょうか? データベースのモードを指定していて、デフォルトは0666だそうですが、何を意図して0664や0666を指定する必要があるのでしょうか?
otn

2018/07/27 12:45

> ”Marshal”を使う意味は、 はい。その通り。数値、文字列、配列、ハッシュくらいであれば、JSONでもYAMLでもいいのですが、Marshalを使うと大部分のオブジェクトがそのまま保存・復元できると思います。 > ”0664” は何の命令でしょうか? それはファイルのパーミッション(アクセス許可)です。0666 は誰でも読み書きできる。0664 は所有者と、所有グループの人のみ書き込め、それ以外の人は読めるが書けない。 状況によっては、0600 を指定する必要があるでしょう。
退会済みユーザー

退会済みユーザー

2018/08/01 08:30

丁寧にいつもありがとうございます。大変勉強になりました!ありがとうございます。
guest

0

kakakuにデータを全部読み込むようなことはせず、見つけたデータをその都度出力しましょう。

投稿2018/07/21 05:02

編集2018/07/21 05:05
hichon

総合スコア5737

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問