Есть ли такой способ узнать, сколько места занимает файл? - PullRequest
1 голос
/ 15 июля 2011

Есть ли такой способ узнать, сколько места в памяти занимает файл перед этим? Например, допустим, у меня есть размер файла 1G байт. Как этот размер файла будет переводиться в объем памяти?

Ответы [ 4 ]

3 голосов
/ 15 июля 2011

Я беру ваш пример из комментария и уточняю, что может произойти с текстовым файлом при загрузке в память: некоторое время назад «текст» обычно означал ASCII (как минимум наименее распространенный знаменатель). И многие программы, написанные на языке, подобном C, будут представлять такие строки ASCII как тип char*. Это привело к более или менее точному совпадению требований к памяти: каждый байт во входном файле занимал один байт при загрузке в ОЗУ.

Но это изменилось в последние годы с появлением Unicode. Тот же текстовый файл, загруженный простой Java-программой (и использующий тип Java String, что весьма вероятно), будет занимать в два раза объем ОЗУ. Это так, потому что тип Java String представляет каждый символ внутри, используя UTF-16 (минимум 16 бит на символ), тогда как ASCII использовал только один байт на символ.

Я пытаюсь сказать следующее: на ваш вопрос нет простого ответа, он всегда зависит от того, кто читает данные и что он собирается с ними делать.

Довольно часто справедливо одно: при «загрузке» данные не становятся меньше.

3 голосов
/ 15 июля 2011

Если вы сразу прочитаете весь файл в память, вам потребуется как минимум размер свободной памяти для файла. Большую часть времени людям на самом деле не нужно этого делать, они просто не знают другого пути. Для объяснения проблемы и альтернатив см .:

http://www.effectiveperlprogramming.com/2010/01/memory-map-files-instead-of-slurping-them/

1 голос
/ 15 июля 2011

Вы можете проверить себя, написав небольшой тестовый скрипт с Память :: Использование .

Из резюме документации:

use Memory::Usage;
my $mu = Memory::Usage->new();

# Record amount of memory used by current process
$mu->record('starting work');

# Do the thing you want to measure
$object->something_memory_intensive();

# Record amount in use afterwards
$mu->record('after something_memory_intensive()');

# Spit out a report
$mu->dump();

Тогда вы узнаетесколько вашей сборки Perl, с учетом того, какую кодировку символов вы намерены использовать, и какой бы способ обработки файла вы ни собирались реализовать, будет потребляться в памяти.

Если вы можете избежать загрузки всего файла сразуи вместо того, чтобы просто перебирать его строка за строкой или запись за записью, проблема памяти исчезает.Так что это поможет узнать, чего вы на самом деле пытаетесь достичь.У вас может быть проблема XY.

0 голосов
/ 15 июля 2011

perldoc -f stat

   stat    Returns a 13-element list giving the status info for a file,
           either the file opened via FILEHANDLE or DIRHANDLE, or named by
           EXPR.  If EXPR is omitted, it stats $_.  Returns the empty list
           if "stat" fails.  Typically used as follows:

               ($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size,
                  $atime,$mtime,$ctime,$blksize,$blocks)
                      = stat($filename);

Обратите внимание на возвращаемое значение $size. Это размер файла в байтах. Если вы собираетесь сохранить весь файл в памяти, вам понадобится как минимум $ байтов. Опять же, вам может понадобиться намного больше (или даже намного меньше), в зависимости от того, что вы делаете с содержимым файла.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...