1

iOSでインメモリSQLite dbのストレステストを行っています。

しばらくすると、OCUnit がこのエラーを発生させました。

otest(79450,0xad21a2c0) malloc: *** mmap(size=40267776) failed (error code=12)
*** error: can't allocate region
*** set a breakpoint in malloc_error_break to debug

これはメモリの限界に達していると思います。しかし、現在のデータベースのサイズを把握できません。私は試した、

sqlite3_status(SQLITE_STATUS_MEMORY_USED, &current, &peak, false);

しかし、これは常に0forを返し、すべて同じ更新currentに対して何らかの値を返します。マニュアル エントリpeakを読みましたが、db サイズ機能のようには見えません。私は間違った場所を掘っていると思います。C-API でデータベースのサイズを取得するにはどうすればよいですか?

4

1 に答える 1

0

あなたのコメントと mmap エラーに基づいて、私がまだ苦労しているものと同様の問題を抱えていると思います - 統合バッファキャッシュの過剰使用。私が推測しているのは、sqlite が mmap ファイルを使用して「メモリ内」データベースをバックアップしていることです。そのため、mmap されたメモリは、統合されたバッファ キャッシュ (共有メモリ プール) を使用し、おそらく malloc されたメモリをあまり使用しません (これが、そこに大きな数値が表示されない理由です)。

現在、ubc キャッシュがますます「ダーティ」になると、iOS はどのインスタンスでも使用できるメモリを奪われ始めます。そのため、ある時点で、sqlite はより多くのメモリを mmap しようとしますが、システムが空き ubc ページを探すとき、空きページはありません。ブロックをフラッシュ ファイル システムにフラッシュするには、長い時間がかかります。

これが厄介な問題である理由は、メモリが少なくなってきていることを発見するためにアプリでできることはほとんどないため、それを回避するための措置を講じることができるからです。

「ダウンロードされた巨大な画像を表示する」オープン ソース プロジェクトで行ったことは、ubc の使用状況を追跡するためのものであり、合計システム メモリの 50% を超えることはありません。

あなたのケースでは、sqlite をファイルベースにしてから、続行する前にファイルを保存して F_FULLSYNC (完了を待つ) 方が良いかもしれません。最終的に、すべてのイメージ作業を、最高水準点を考慮したシリアル ディスパッチ キューに注ぎ込みました。

于 2012-07-22T14:33:38.447 に答える