2012-03-15 6 views
3

PHPExcelフレームワークを使用して、非常に大きなExcelドキュメントをmysqlクエリから書き出しようとしています。PHPExcel - チャンクで書き込み/追加する

すべては、ページがエラーでフラグが付けられます(の程度がや)私は5000行のマークを打つまでは正常に動作します:

Fatal error: Allowed memory size of xxx bytes exhausted (tried to allocate yyy bytes) in zzz on line aaa 

私はこれが文書化されている知っている、と私は上のメモリ割り当てを調整しています私はまだ天井に当たっています。私も書式をオフにしようとしましたが、現実にはそれが必要になります。

私はメモリ割り当てを使い果たしていないので、小さなチャンクで書き込むか、Excelドキュメントに追加する方法がありますか?私はページの行に沿って考えている1000行を言うと、それ自身にリダイレクトし、追跡するためにGETを使用して次の1000を処理する。たとえば:

index.php?p=0

はその後

index.php?p=1000

にリダイレクトしかし、私は、全体の事を開くことなく、既存の文書に追加する方法を見つけることができません。

答えて

3

チャンクに書き込む方法はありませんが、一般的な間違いは、mysqlデータを配列にロードしてから、Excelセルデータを設定する配列をループすることです。 mySQLクエリ結果セットをループする際に、セルデータを設定する方がメモリ効率が向上します。

メモリ使用量を最小限に抑える必要がある場合は、どのセルのキャッシュ方法を使用していますか?セルキャッシングは遅くなりますが、大量のメモリを節約できます。

+0

キャッシュ!私はそれを設定していない、良いコール。クイックフォローアップの質問、大量の書込みがある大量のドキュメントの場合、どのキャッシュメソッドを選択しますか?私は 'cache_to_discISAM'を試してみましたが、これは約6,000列までの10,000行まで働いていましたが、60,000でバグアウトしました。私が間違ってしまわないようにしてください10,000は素晴らしいですが、十分なものになりますが、私は自分のアプリをテストするのが好きです。この場合の速度は気にしません – Chris

+0

編集2 - 私はApache/Linuxサーバー上で実行しています(キャッシュを勝ち取る) – Chris

+0

現行のプロダクションリリースのキャッシュメソッドはすべて、 "のように、DiskISAMはphpTempと同様に、メモリ内のファイルにセル参照のサイズと位置を保持しています。プロダクションコードで最もメモリ効率の良いキャッシングメカニズムは、memcache、APC、WinCacheです。マップは単純な「セル存在」ブール値です。最新のSVNコード(プレリリーステスト版)はSQLiteをキャッシュオプションとして追加しています。これはさらにメモリ効率が良いです(メモリ内のマップは全くありません。すべてがSQLite内にあります) –

関連する問題