Объем памяти для данных ракетки и структуры данных

Кто-нибудь знает, есть ли функция, которая возвращает размер некоторой структуры данных, например, sys.getsizeof в python, в ракетке?


person cobie    schedule 20.05.2013    source источник


Ответы (1)


Встроенной такой функции нет. Можно написать такую ​​функцию, используя функциональность FFI, но нужно немного знать о внутренностях Racket.

Есть ли конкретная структура данных, которая вас интересует? Возможно, можно вычислить размер по количеству элементов в нем, не используя общую функцию.

person soegaard    schedule 20.05.2013
comment
работая с битовыми векторами, и я пытаюсь примерно выяснить, сколько памяти займет 1000000000 битовый вектор - person cobie; 20.05.2013
comment
Вам повезло! (Я написал первоначальную версию кода битового вектора.) В любом случае, битовый вектор упаковывает 8 битов в байт. Байты хранятся в байтовой строке. Строка байтов, в свою очередь, хранится в структуре, которая также содержит число, представляющее количество битов в битовом векторе. Вкратце: n бит использует n/8 байт плюс несколько слов для учета. - person soegaard; 20.05.2013
comment
Далее я должен спросить, почему использование векторов нормалей кажется более быстрым, чем использование битовых векторов? Я использовал нормальные векторы в сите эратосфена для генерации простых чисел до 100 000 000, и это было намного быстрее (до 5 раз быстрее), чем когда я использовал битовые векторы. Есть ли что-то, что мне не хватает? - person cobie; 20.05.2013
comment
Логические значения представлены как непосредственные. То есть они представлены как одно слово (32 или 64 бита в зависимости от машины). Вектор чего-либо представлен в памяти как число (количество элементов в векторе), за которым следуют элементы в векторе. Если a — адрес вектора, логическое значение можно получить просто как (в нотации C) a[1+n] или *(a+1+n). То есть (vector-ref v n) сводится к простой ссылке на память (я игнорирую проверку ошибок). С другой стороны, битовому вектору требуется 1 ссылка на память для поиска строки байтов. - person soegaard; 21.05.2013
comment
Вычисление от n до индекса байта, содержащего бит n. Ссылка на память для получения байта. Небольшой расчет для получения отдельного бита (в виде числа). И, наконец, преобразуйте бит (как число) в логическое значение. - person soegaard; 21.05.2013
comment
То есть: Преимущество бит-вектора не в том, что они быстрые, а в том, что они используют меньше памяти. Обычный вектор логического значения использует n*64 бита на 64-битной машине, тогда как битовый вектор использует только n бит. - person soegaard; 21.05.2013