2011-08-10 48 views
4

我有一個問題關於寫入二進制文件R.我工作的數據壓縮和我想寫的是可在兩個字節表示的二進制文件整數,但R代表他們在4個字節。有沒有任何數據類型可以以兩字節或一字節的形式存儲數字(類似於C中的短整數)?寫小整數到二進制文件中的R

如果不是這樣,當你使用writeBin和一個小整數(例如可以保存在1個字節中)和size = 1時,程序是寫入整數的所有4個字節(包括0字節)還是它將其轉換爲1個字節。

這是我和你的幫助,將不勝感激一個非常重要和緊迫的問題。如果您知道寫入二進制文件的全面幫助,請告訴我。謝謝! (有時,當我使用writeBin的大小等於小數字,我得到一個錯誤,說大小沒有在我的機器上定義,我該如何解決這個問題?什麼是最好的方法來寫整數文件壓縮的目的(有儘可能小的文件)?是否原始數據類型的幫助?)

回答

2

你可能讓你的生活太複雜了。 R在默認情況下在save()中使用壓縮,您是否測量過這個還不夠好?舉個例子:

R> vec <- rep(1L, 100)     ## 100 integer elements 
R> object.size(vec) 
440 bytes        ## so there must be a 40 byte overhead 
R> str(vec) 
int [1:100] 1 1 1 1 1 1 1 1 1 1 ... 
R> save(vec, file="/tmp/vec.RData") 
R> file.info("/tmp/vec.RData")[1:3] 
       size isdir mode 
/tmp/vec.RData 64 FALSE 644   ## stored to 64 bytes! 
R> 

你可以說的是,重複值是理想的壓縮,但他們甚至可能保持你的數據集?

否則,也許嘗試的CRAN包ff支持一個和兩個字節的類型。

最後,如果你想完全控制,你可以使用C或C++分配到更短的整數類型,甚至char類型。有一個package I could recommend for interfacing C++ ...

+0

非常感謝!我想在「for」循環中寫入數據,所以我需要在一個文件中保存多次而不刪除以前的內容,否則我將不得不一次保存的數據將會很大。我想知道是否有一種方法可以使用同一個文件多次「保存」(保留舊數據),或者對可以一次寫入的數據大小有任何限制。 – amy

0

尺寸參數writeBin應該是1,2或4的整數 - 8件作品太多,但不是壓縮;-)

真的需要大小= 3 ?

writeBin會將整數值寫入每個整數只有您指定的字節數。如果整數不適合,則高位被無聲地跳過。

對於符號的值(默認):

size=1 for integer values between [-128, 127] 
size=2 for integer values between [-32768, 32767] 

或者,如果你看過他們在簽訂= FALSE:指定大小寫值過大的

size=1 for integer values between [0, 255] 
size=2 for integer values between [0, 65535]. 

例子:

writeBin(254:257, "foo.bin", size=1) 
readBin("foo.bin", "int", 4, size=1, signed=FALSE) # 254 255 0 1