2016-05-13 4 views
0

現在、Swiftを使用してiOSにデータを保存しています。値は、[[Int]]として定義された2次元整数配列として返されます。これらの整数配列をディスクに保存する必要があります。現在、私はそうするために、次の関数を使用しています:iOSを使用してオンザフライで2次元配列を圧縮

func writeDataToFile(data: [[Int]], filename: String){ 

    let fullfile = NSString(string: self.folderpath).stringByAppendingPathComponent(filename+".txt") 
    var fh = NSFileHandle(forWritingAtPath: fullfile) 
    if fh == nil{ 
     NSFileManager.defaultManager().createFileAtPath(fullfile, contents: nil, attributes: nil) 
     fh = NSFileHandle(forWritingAtPath: fullfile) 

    } 
    fh?.writeData("Time: \(filename)\n".dataUsingEncoding(NSUTF16StringEncoding)!) 
    fh?.writeData("\(data)".dataUsingEncoding(NSUTF16StringEncoding)!) 
    fh?.closeFile() 
} 

現在、この機能はうまく動作しますが、それは比較的大きな(1.1メガバイトそれぞれのファイル生成 - あなたは1 Hzでそれらを書いている、取得します非常に速い)。書き込まれた配列のサイズは固定されており、値は20000 < x < 35000です。このデータを圧縮して後でPythonや他の言語にデータを読み込む方法はありますか? zipのようなライブラリを書いた後にzipに圧縮するほうが簡単でしょうか?データを(データ/忠実度を失うことなく)画像に変換する方法がいくつかあります(圧縮目的で、表示目的ではありません)。タイムスタンプなど、2次元配列とともに保存したいメタデータがいくつかあります。

+2

を使用すると、現在の文字列値としてそれらを保存しているので、最も簡単かつ最速の小型化は、バイナリ値(またはbase64でエンコードされたとして保存することです文字列)。次に、すべてのint値を2バイトセットに変換し(符号なし2バイトは65536まで格納できるため)、そのように値を保存します。これはint値あたり5バイトからint値あたり2バイトになります。 60%の即時節約。 – Putz1103

+0

これを回答優勢のポイントにする必要があります。私がUTF-16として保存する必要は全くありません。それはちょっとばかげたことでした。 ASCIIに切り替えるとファイルサイズが〜500 kbになり、非常に役立ちます。 base64でエンコードされた文字列のクラスはありますか? – Laxsnor

答えて

2

現在、これらの文字列を文字列値として保存しているため、サイズを2進値(またはbase64で符号化された文字列)として保存するのが最も簡単で最速のサイズ縮小です。次に、すべてのint値を2バイトセットに変換し(符号なし2バイトは65536まで格納できるため)、そのように値を保存します。これはint値あたり5バイトからint値あたり2バイトになります。 60%の即時節約。

Base64エンコーディングの場合、私はインターネット上でNSData + Base64と呼ばれるものを使用します。しかし、それを見ている中で、私はちょうど読み:

In the iOS 7 and Mac OS 10.9 SDKs, Apple introduced new base64 methods on NSData that make it unnecessary to use a 3rd party base 64 decoding library. What's more, they exposed access to private base64 methods that are retrospectively available back as far as IOS 4 and Mac OS 6.

Link.

あなたは次の1つの要素からそのデータを実現することにより、圧縮にずっとさらに行くことができる可能性が全体の範囲で変更されることはありません、ヒートマップは常にグラデーションであるためです。次に、最後の要素からの差分として配列を保存し、その値を1バイト(255値)の変更セットにする可能性があります。しかし、非常に速い熱勾配(または低解像度カメラを使用して)を見ていると、精度が低下する可能性があります。

最終的に圧縮する必要がある場合は、GTMNSData+zlibを使用して、c#webserviceで圧縮解除します。だから少しの作業でそれはクロスプラットフォームです。

0

この問題に対する適切な答えには、問題のドメインに関する詳細が必要です。おそらく、2D配列はこのためのデータ構造が間違っていますが、それ以上の情報を伝えるのは難しいです。

これらのアレイに格納されているデータは何ですか?

+0

赤外線カメラの温度値。値はtrunc(ケルビン* 100)です。通常は、絵として保存するだけですが、その際に精度が失われるようです。 – Laxsnor

関連する問題