2016-05-13 72 views
0

我目前使用Swift在iOS上存儲一些數據。這些值以2-D整數數組的形式出現,定義爲[[Int]]。我需要將這些整數數組保存到磁盤。目前,我使用下面的函數可以這樣做:用iOS快速壓縮2D陣列

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.1MB每個 - 其時你在1赫茲寫他們,得到巨大的快速)。寫入的數組具有固定的大小,值將從20000 < x < 35000.有沒有辦法在運行中壓縮這些數據,以便稍後可以將數據讀入Python或某種其他語言?在使用Zip之類的庫來將文件壓縮成zip之後會更容易些嗎?是否有某種方法可將數據(不會丟失數據/保真度)轉換爲圖像(用於壓縮目的,而不是查看目的)。有一些我想與二維數組一起存儲的元數據,例如時間戳。

+2

由於您目前保存那些爲字符串值,最簡單和最快的尺寸縮小。將它們保存爲編碼的二進制值(或Base64字符串)。然後,您可以將所有的int值轉換爲2個字節的集合(因爲無符號的2個字節最多可以存儲65536個字節)並以這種方式保存值。這將從每個int值5個字節降低到每個int值2個字節。立即節省60%。 – Putz1103

+0

你應該把它變成一個非常好的答案。我絕對沒有必要把它當作UTF-16保存,這有點荒謬。切換到ASCII文件大小爲〜500 kb,這非常有幫助。是否有base64編碼字符串的類? – Laxsnor

回答

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.

你可以從一個元素走得更遠,進入壓縮通過實現數據到下一個很可能不會通過整個範圍內變化,因爲熱圖總是會是漸變的。然後,可以將數組保存爲自最後一個元素以來的差異,並且可能會將這些數組降至單個字節(255值)更改集。但是,如果您正在查看具有非常快的熱梯度(或使用低分辨率相機)的東西,則可能會失去精度。

如果你最終需要進入壓縮,我使用GTMNSData+zlib並在c#webservice中解壓縮。所以通過一點點工作,它就是跨平臺的。

0

對此的正確答案需要關於問題域的更多信息。最有可能的是,2D數組對於這個數據結構是錯誤的,但是如果沒有更多的信息,很難說清楚。

這些數組中存儲的數據是什麼?

+0

紅外熱像儀的溫度值。值是trunc(開爾文* 100)。通常情況下,我會把它保存爲一張圖片,但我似乎在這樣做時會失去一些精確度。 – Laxsnor