2011-10-21 3 views
8

私は自分のカスタムオブジェクトにラップされたコアデータに解析して保存した215MBのcsvファイルを持っています。問題は私のコアデータsqliteファイルは約260メガバイトです。 csvファイルには、私の都市の交通システム(バス停、時間、ルートなど)に関する約450万行のデータが含まれています。どのように最小化またはコアデータsqliteファイルのサイズを圧縮しますか?

停止時間を表す文字列がNSDataファイルとして代わりに格納されるように属性を変更しようとしましたが、何らかの理由でファイルサイズが約260MBのままです。

このサイズのアプリは発送できません。私は誰もが260MBのアプリをダウンロードしたがっていると思うが、それは都市の通過スケジュールがあることを意味している。

使用するストレージスペースを圧縮または最小限に抑える方法はありますか(コアデータを使用しない場合でも、私は提案を聞いていますか?)

編集:私は信じられないほどのファイルサイズを見つめているので、今すぐアップデートを提供したいだけです。文字列、索引付け、およびデータベースの正規化を含む巧妙な操作では、圧縮したときにサイズを6.5MBまたは2.6MBに縮小することができました。コアデータに保存されているおよそ105,000のオブジェクトは、都市の交通システムの詳細を含んでいます。私は今ほとんど涙が出ています。D:

+0

あなたの最終的なサイズについての最新のコメントを見ました。非常に印象的。実世界のデータを100:1に圧縮すれば、誰もが誇りに思うはずです。 –

+0

非常に遅いですが、アプリのTransitをチェックすると、私は彼らと話し合いましたが、260MBを** 800KB ** – Milo

答えて

0

データベースの正規化を行うことができます。

重複している可能性のあるものや、複数の行に同じ値が格納されているものを探します。これらの重複した値が存在する場合は、それらの値が別々のテーブルに格納され、元の行からIDで参照されるように、おそらくデータベースを再構成する必要があります。

0

sqliteファイルの圧縮率はどのくらいですか?満足のいくサイズであれば、最も簡単な方法は圧縮して出荷し、NSCachesDirectoryに解凍することです。

+0

にすることができました。 "圧縮された"とはgzip、btwで圧縮されたことを意味します。 –

+0

gzipファイルの場合は57.7MBです。あなたはここにいるかもしれません。私の唯一の関心事は、電話を圧縮解除するまでにどれくらいの時間がかかるかということです。 –

8

元のCSVが本当に愚かな方法でエンコードされていない限り、圧縮してもサイズが100Mを下回ることはないようです。それはアプリにとってまだまだ大きなものです。解決策は、データをWebサービスに移動することです。重要な部分をダウンロードしてキャッシュしたいかもしれませんが、何百万ものレコードについて話しているのであれば、サーバからフェッチするのが最善の方法です。さらに、私は時々通過システムが変化すると信じなければならず、1回のストップ調整があるたびに10-of-MBのアプリをアップグレードしなければならないという不満があります。


私がいることを言ってきましたが、実際にあなたが考えるかもしれないいくつかのものがあります:

  • 移動ブール値はビットフィールドに。 NSUIntegerに64個のブール値を入れることができます。 (ちょうど8ビットが必要な場合は完全な64ビット整数を使用しないでください。できるだけ小さなものを保存してください)
  • 時間を保存する方法を圧縮します。 1日に1440分しかありません。これを2バイトで保存することができます。乗り継ぎ時間は一般に2回目ではありません。彼らはCGFloatを必要としません。
  • 曜日と日付は同様に圧縮できます。
  • 明らかに、任意の文字列を正規化する必要があります。多くの行に重複した文字列値がないかCSVを見てください。
  • 私は一般的にこの種の問題のコアデータではなく、raw sqliteを推奨します。コアデータは、生データストレージよりもオブジェクトの永続性に関するものです。あなたがCSV(それ自体は非常に効率的ではない)に対して20%の膨張を見ているという事実は、この問題の良い方向ではありません。
  • さらに緊密になりたいし、優れた検索機能が必要ない場合は、パックされたデータブロブを作成できます。私はメモリが非常にタイトな電話スイッチでこれをやっていました。ビットフィールド構造体を作成して、1つの変数に5ビット、別の変数に5ビットを割り当てます。これにより、ワード境界で正しく整列するようにシャッフルすることができます。

あなたが最初のダウンロードサイズ最も関心、そしてより高速なアクセスのために、後にデータを展開することをいとわないかもしれないので、あなたは非常にドメイン固有の圧縮を検討することができます。例えば、上の議論では、一度に2バイトに落とす方法を述べました。前回からデルタ分として時刻を格納することで、多くの場合1バイトになる可能性があります(バスと電車のスケジュールの場合、ほとんどの時間がかなり小さなステップで増加するため)。データベースを放棄すると、最初に起動したときにデータベースに抽出できる非常に厳密にエンコードされたデータファイルを作成できます。

また、ドメイン固有の知識を使用して、文字列をより小さなトークンにエンコードすることもできます。もし私がニューヨークの地下鉄システムをエンコードしていたら、 "Avenue"、 "Road"、 "Street"、 "East"などの文字列がたくさん現れることに気付くでしょう。 A、^ R、^ S、^ Eなど、おそらく2バイト(0x8A13)として "138 Street"をエンコードします。これはもちろん、地下鉄の停留所には決して登場しないという私の知識に基づいています(0x8a)。これは一般的な解決策ではありません(パリでは問題になるかもしれませんが)、あなたは特別な知識があるデータを高度に圧縮するために使用できます。ワシントンDCのような都市では、最も高い番号の通りが38th Stであり、次に4価値の方向があると思います。だから、2バイトで、最初に「番号付きストリート」トークンを符号化し、次に象限に2ビット、ストリート番号に6ビットのビットフィールドをエンコードすることができます。このような考え方は、データサイズを大幅に縮小する可能性があります。

+0

私はあなたに完全に同意します。しかし、このアプリは、すべてのデータが含まれなければならないという意味でオフラインで操作できるようになっています。そうでなければ、これは実際に私の心を越えて理想的になりました。 –

+0

ええ;私は、CSVをよりよく保存する方法についてもっと多くのことを考えていました。私にはたくさんの選択肢があると思う。 CSVはそれほど効率的ではありません。私はあなたがgzipから抜け出すことができるものは、より賢明なストレージソリューションをより良く得ることができると思います。 –

+0

あなたの思いやりのある応答のためにRobに感謝します。私はデータベースを調べ、多くの情報、特に頭字語が繰り返されていることに気付きました。これらの頭文字はそれぞれ文字列として格納されています。それを取り除くために今すぐコードに行きましょう。私はデルタ時間のあなたの提案が好きであり、そのショットを与えるでしょう。うまくいけば、私はこの獣を200MB未満にしてから、gzipして最初の実行時にキャッシュフォルダに展開することができます。 –

関連する問題