14歳の自分に衝撃の事実を告げてください

上から順に読み込み、順次処理していき最終的には全部処理します。CSVファイルは読むだけです。

やり方はいくつか考えられます。
1
100万行ずつシートに読み込み、終わったら次を読み込む。CSVファイルは開きっぱなし。

2
100万行ずつのエクセルファイルに分割し、順次開いて処理。ファイル開閉に時間がかかる

3
2千万行の巨大な配列に代入し、順次処理。
CSVファイルは閉じることが出来る。

3がいいように思えますが、どうでしょうか?使用メモリは1と同じですか?

質問者からの補足コメント

  • 1行ずつ読み込んで処理後にもう一行、は考えてません。1シート分のデータが揃って初めて処理が可能だからです。

    ソフトはエクセルVBAのみ考えてます。Perl, Rubyなど別プログラムは来世で考えます。
    「データベースに登録」と言われてもピンと来ないので、SQL等はたぶん無理です。

    No.1の回答に寄せられた補足コメントです。 補足日時:2015/10/07 20:57
  • 現状で100万行の読み込みは可能です。配列に読み込むにしても2000万行は無理っぽいけど100万行は大丈夫だと思います。

    懸念点は、最初から最後まで巨大なCSVファイルを開いたまま処理することです。特に問題ないなら、案1で行きます。

    No.4の回答に寄せられた補足コメントです。 補足日時:2015/10/08 19:45

A 回答 (6件)

> 懸念点は、最初から最後まで巨大なCSVファイルを開いたまま処理することです。



それに関しては問題ないです。VBAのOpenでファイルを開いた場合、実は一切読んでいません。今何行目を読んでいるかを示すカウンタを用意するだけです。またLine Inputで読み込む場合も、今操作している一行しか相手にしません。

だからこそ、実装している物理メモリ量をはるかに超えるサイズのファイルを扱っていても、仮想メモリのお世話にならずに済むわけです。

なので懸念材料はそこではなく、分割処理することによってデータ同士の断絶が起きると言うか、連続性がなくなることでしょうか。最初の100万行の固まりと、次の100万個の固まりには全くつながりがないことになるので。
    • good
    • 1
この回答へのお礼

ありがとうございます。
メモリに関しては問題ないということですね?
データの連続性は特に問題ありません。末尾の調整くらいはしますが。

お礼日時:2015/10/09 20:27

#2で回答したものです。


案1を採用したい旨の補足がありましたが、
これは、1sheetで100万行分を格納するので、
20sheet使用すると理解しました。
2千万行のデータを1sheetに100万行ずつ格納していくと、
私の環境では、8シートぶんを作成したあたりで、メモリ不足となり、処理が続行できなくなりました。
私の環境は、windows7(64Bit) メモリ12Gバイト excel2007です。
(#2でメモリ4Gバイトと書きましたが、誤りでした。12Gバイトが正しいです)

案1を採用される場合、メモリ不足が発生するかもしれませんので、
簡単なプロトタイプを作成し、2千万行が20sheetに格納できることを
まず確認することをお勧めいたします。
    • good
    • 0
この回答へのお礼

再度ありがとうございます。
100万行を1シートに格納しデータ処理を終えたら、そのデータはクリアし次の100万行を読み込みます。
なのでシートは1枚です。速度アップのため配列に入れて使用すると思うので、実際は未使用です。

お礼日時:2015/10/09 23:51

まだExcel95の当時に、100万行のログデータを解析しろと言う案件があって、その時はExcelは使わずにgawkで順次処理したっけか…Excelの限界が65535行だったのと、割合順次処理しやすいデータ構造だったためにそうしたんですが。



ところで今回のデータは、最低何行あれば意味をなすんですか?どうしても最低100万行かそれ以上に必要なのか、あるいは1000行くらいあれば良いのか。それによって方針は変わってきませんか?後者ならば、非常識な大きさの配列なりメモリは必要ないから、かなり楽になります。またデータフォーマットにもよるでしょう。カラム数や各カラムに何バイト用意すればよいのか、それもあります。1レコードのデータサイズが大きいと、100万行なんて処理したくてもできないかも知れないので。
この回答への補足あり
    • good
    • 0

No.2の回答では


3はメモリ不足で読み込めないという悲しい現実の前に挫折することを危惧しているのではないだろうか。
自分もそれを考慮に入れて1を勧める。

自分が質問のケースに遭遇したら2度手間にはなるが、エディタでCSVファイルを100万行ずつ分割するかな。
その上でシートに分けるかブックに分けるかを検討する。


・・・しかし、データの量に応じて列を少なくして行を増やすような仕様にならないものか。
16384列もいらないぞ。個人的には500~800列もあれば十分なケースばかりだ。
    • good
    • 0
この回答へのお礼

お礼が大変遅くなりました。
後日談ですが、1を採用しましたがメモリ不足(詳細原因不明)で途中で止まります。Lineなら1行しか見ないのでメモリ不足とは無縁と思ってやって来ましたが、8シート目くらいで力尽きました。で、今は回答頂いたファイル分割しようか思案してるところです。

お礼日時:2016/02/13 20:53

3がいいと思います。


1を行うと、シートのぶん、余計にメモリを使用します。
但し、3を行うには、十分なメモリを搭載したマシンで行うことが前提になるかと思います。
参考までに、1行約100バイトで2千万行のデータを作成すると約2Gバイトのファイルになります。
このファイルを全て読み込み、内部メモリの配列に格納すると、
私のマシンはWindows7(内部メモリ4Gバイト)ですが、全て読み込むことが
出来ませんでした。
excel2003で実行時、約800万行で停止してしまいました。

老婆心ながら、あなたが3で行われる場合、まず、簡単なプログラム(2千万行を内部メモリに格納するだけのプログラム)を作成し、最後まで読み込むことが出来るかどうかを試されることをお勧めします。
    • good
    • 0
この回答へのお礼

ありがとうございます。
3がダメだった場合(ダメな可能性が大きい)、1ですか?一旦閉じないで開きっぱなしにする理由は、一旦閉じて次回開くとまた1行目から読み込む必要があるからです(そのように聞いてます)。100万行を20回、しかも後半は読込開始行を探す時間が多くなります。

2は分割ファイルを作る所要時間がきになります。
大容量ファイルの読み込みは他にもやってる人は多いと思いますが、皆どうやってるんだろう?
tatsu99さんは結局どんな方法にしたのでしょうか?

お礼日時:2015/10/08 00:14

具体的に読み込んでどんな処理をしたいかにもよりますが



4.
1行読み込み→処理を繰り返す
シートには結果だけ

5.
別なプログラム(PerlだのRubyだのPythonだので作る)で処理して、結果だけExcelに取り込む

6.
データベースに登録してSQLで集計結果だけをExcelに取り込む

番外
Excelは使わない

等も考えられます。
この回答への補足あり
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


おすすめ情報

このQ&Aを見た人がよく見るQ&A