Запись небольших целых чисел в двоичные файлы в R - PullRequest
4 голосов
/ 10 августа 2011

У меня есть вопрос о записи в двоичные файлы в R. Я работаю над сжатием данных и хочу записать в двоичный файл целые числа, которые могут быть представлены в двух байтах, но R представляет их в 4 байта. Есть ли какой-либо тип данных, который может хранить числа в двухбайтовых или однобайтовых (что-то вроде короткого целого числа в C)?

Если нет, то при использовании writeBin с небольшим целым числом (которое может быть сохранено, например, в 1 байт) и размером = 1, программа записывает все 4 байта целого числа (включая 0 байтов) или преобразует это до 1 байта.

Это очень важная и неотложная проблема для меня, и ваша помощь будет принята с благодарностью. Если вы знаете о всесторонней помощи при записи в двоичные файлы, пожалуйста, дайте мне знать. Спасибо!

(Иногда, когда я использую writeBin с размером, равным маленьким числам, я получаю сообщение об ошибке, говорящее, что размер не определен на моей машине. Как я могу это исправить? Как лучше всего записать целые числа в файлы для сжатия цели (иметь как можно меньше файлов)? Помогает ли тип необработанных данных?)

Ответы [ 2 ]

2 голосов
/ 10 августа 2011

Возможно, вы делаете свою жизнь слишком сложной.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 типов.Существует пакет , который я мог бы рекомендовать для взаимодействия с C ++ ...

0 голосов
/ 11 августа 2011

Аргумент размера для writeBin должен быть 1, 2 или 4 для целых чисел - 8 тоже работает, но не для сжатия ;-)

Вам действительно нужен размер = 3?

writeBin запишет целочисленные значения с таким количеством байтов на целое число, которое вы укажете.Если целое число не подходит, старшие биты молча пропускаются.

Для значений со знаком (по умолчанию):

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

Или, если вы читаете их со знаком Sign = 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...