Боюсь, что разница минимальна.
Принцип будет достаточно простым: вместо (в вашем примере) 160 строк вы просто сохраните 2 вместе с 160 целыми числами (которые являются только4 байта).
За исключением того, что тип R хранит символы внутренне одинаково.
Каждый современный язык поддерживает строку (практически) неограниченной длины.Это создает проблему, заключающуюся в том, что вы не можете хранить вектор (или массив) строк как один непрерывный блок, поскольку любой элемент может быть сброшен на произвольную длину.Поэтому, если одному элементу назначено другое значение, которое оказалось несколько длиннее, это означало бы, что остальная часть массива должна быть смещена.Или ОС / язык должны резервировать большие объемы пространства для каждой строки.
Поэтому строки хранятся в любом удобном месте в памяти, а массивы (или векторы в R) сохраняются как блоки указателей к месту, где значение действительно есть.
В первые дни R каждый указатель указывал на другое место в памяти, даже если фактическое значение было таким же.Итак, в вашем примере 160 указателей на 160 ячеек памяти.Но это изменилось, в настоящее время он реализован в виде 160 указателей на 2 области памяти.Там могут быть некоторые небольшие различия, в основном потому, что фактор обычно может поддерживать только 2 ^ 31-1 уровней, то есть 32-битные целые числа достаточно для его хранения, в то время как персонаж в основном использует 64-битные указатели.Опять же, есть больше накладных расходов на факторы.
Как правило, может иметь некоторое преимущество в использовании фактора, если у вас действительно большой процент дубликатов, но если это не так, это может даже повредить использованию вашей памяти,
И приведенный вами пример не работает, поскольку вы сравниваете data.frame с фактором, а не с голым символом.
Еще сильнее: когда я воспроизводю ваш пример, я получаю тольковаши результаты, если я установлю stringsAsFactors
на FALSE
, так что вы сравниваете фактор с фактором в data.frame.
Сравнение результатов в противном случае дает намного меньшую разницу: 1568 для символа, 1328 для фактора.
И это работает только в том случае, если у вас много одинаковых значений, если вы посмотрите на это, вы увидите, что коэффициент может быть больше:
> object.size(factor(sample(letters)))
2224 bytes
> object.size(sample(letters))
1712 bytes
Так что, как правило, нет реального способасжимайте ваши данные, сохраняя при этом удобство работы, за исключением использования здравого смысла в том, что вы действительно хотите сохранить.