2014-12-31 2 views
0

Я хотел узнать, сколько памяти используется (в байтах) по типам данных. Я вызвал метод size на целое число. Так как я бегу 64 битной машине, он возвращается 8.Поиск выделения памяти из массивов Ruby

1.size # => 8 

Аналогично, для строк и массивов, он возвращается 1 байт на символ/целое число.

'a'.size # => 1 
['a'].size # => 1 
['a', 1].size # => 2 
  1. Почему не существует никакого метода, размер поплавка?
  2. Не должно быть гетерогенных массивов, таких как ['a', 1] return 1 + 8 = 9 bytes (1 для char, 8 для целых чисел)?
  3. Правильно ли вызывать size для проверки памяти, выделенной для типов данных ruby?
+0

В случае массива метод размера - это просто псевдоним метода длины массива (который представляет собой просто количество элементов в массиве). аналогично, в случае строк метод размера - это просто длина символа строки. – rakeshbs

+2

В заголовке вы указываете, что массив не имеет 'size'. В тексте вы указываете, что float его не имеет. Неясно, что вы имеете в виду. – sawa

+0

'' € π'.size' возвращает '2'; поэтому '.size' подсчитывает количество * символов * в строках, а не * bytes *. – Carpetsmoker

ответ

3

Это два разных метода, которые служат для разных целей для двух разных типов данных.

В примере 1 вы применяете size к fixnum. Этот метод:

Returns the number of bytes in the machine representation of fix. 

источник: http://www.ruby-doc.org/core-2.2.0/Fixnum.html#method-i-size

Однако при использовании массива, size является псевдонимом для length. Здесь: http://www.ruby-doc.org/core-2.1.2/Array.html#method-i-size. Что:

Returns the number of elements in self. May be zero. 
1

Array#size возвращает количество элементов Array, а не выделенной памяти.

6

Я думаю, что вы ищете использование памяти МРТ. Ruby имеет ObjectSpace: библиотека objspace расширяет модуль ObjectSpace и добавляет несколько методов для получения внутренней статистической информации об управлении объектами/памятью.

Для использования этого модуля расширения необходимо использовать «objspace».

Вот что вы получите:

> require 'objspace' 
=> true 
> ObjectSpace.memsize_of(Array) 
=> 5096 
> ObjectSpace.memsize_of(Hash) 
=> 3304 
> ObjectSpace.memsize_of(String) 
=> 6344 
> ObjectSpace.memsize_of(Integer) 
=> 1768 

Примечание: Как правило, вы НЕ ДОЛЖНЫ использовать эту библиотеку, если вы не знаете, о выполнении МРТ. В основном, эта библиотека предназначена для разработчиков (разработчиков) и разработчиков МРТ (памяти), которые должны знать об использовании памяти МРТ.

+0

Из документации по этому методу: * Обратите внимание, что размер возврата является неполным. Вам нужно иметь дело с этой информацией только как СОВЕТ. В частности, размер T_DATA может быть неправильным. * – spickermann

+0

@spickermann: Да, вы правы. На самом деле мне никогда не нужно использовать это в своем развитии.Как спросила ОП, поэтому я также хотел узнать и получить это решение. –

Смежные вопросы