[Back]
Block display

ファイル読み込み速度 Name:Y. Seimiya Date:2016/05/18(Wed) 10:31:29 No.106

SADで10M程度のテーブルファイルを読み込む際、以下のように書いているのですが、読み込みに5分から10分程度かかってしまいます。早く読み込む方法をご存知でしたら教えていただけますと幸いです。

While[((v=Read[f,Real])<=>EndOfFile),AppendTo[tbl,v]];

Re: ファイル読み込み速度 Name:Anonymous Date:2016/05/18(Wed) 13:23:29 No.107

> SADで10M程度のテーブルファイルを読み込む際、以下のように書いているのですが、読み込みに5分から10分程度かかってしまいます。早く読み込む方法をご存知でしたら教えていただけますと幸いです。
>
> While[((v=Read[f,Real])<=>EndOfFile),AppendTo[tbl,v]];

1. 長いリストに対するAppendToの効率は極めて悪い
While + AppendTo Table + Breakに置き換える
Table[With[{v = Read[f, Real]}, If[v === EndOfFile,Break[], v]], {Infinity}]
但し、長すぎると SAD Stackがあふれるので、長さが不定なら適当な長さでTableを止めて外部のループでFlatte[*, {1}]かJoinでつなぐ

2. Whileで繰り返しReadを呼び出すのが効率が悪い
File Formatが既知であれば、OpenRead時に shell commandを渡して、SAD Listに整形してしまう
f = OpenRead["!(echo '{'; sed <some-replace-commands> <file>; echo 'Null[]}' )"];
tbl = Read[f];
Close[f];

Re^2: ファイル読み込み速度 Name:Y. Seimiya Date:2016/05/19(Thu) 14:12:10 No.108

> > SADで10M程度のテーブルファイルを読み込む際、以下のように書いているのですが、読み込みに5分から10分程度かかってしまいます。早く読み込む方法をご存知でしたら教えていただけますと幸いです。
> >
> > While[((v=Read[f,Real])<=>EndOfFile),AppendTo[tbl,v]];
>
> 1. 長いリストに対するAppendToの効率は極めて悪い
> While + AppendTo Table + Breakに置き換える
> Table[With[{v = Read[f, Real]}, If[v === EndOfFile,Break[], v]], {Infinity}]
> 但し、長すぎると SAD Stackがあふれるので、長さが不定なら適当な長さでTableを止めて外部のループでFlatte[*, {1}]かJoinでつなぐ
>
> 2. Whileで繰り返しReadを呼び出すのが効率が悪い
> File Formatが既知であれば、OpenRead時に shell commandを渡して、SAD Listに整形してしまう
> f = OpenRead["!(echo '{'; sed <some-replace-commands> <file>; echo 'Null[]}' )"];
> tbl = Read[f];
> Close[f];


ご回答ありがとうございます。おかげで問題が解決いたしました。

- WebForum -