有没有一种方法可以知道文件预先占用多少内存空间? 例如,假设我的文件大小为1G字节。该文件大小将如何转换为内存大小?
答案 0 :(得分:3)
如果您一次将整个文件读入内存,则至少需要文件可用内存的大小。人们实际上并不需要这样做的大部分时间,他们只是不知道另一种方式。有关问题和替代方案的解释,请参阅:
http://www.effectiveperlprogramming.com/2010/01/memory-map-files-instead-of-slurping-them/
答案 1 :(得分:3)
我从评论中提取你的例子并详细说明加载到内存时文本文件可能会发生什么:前一段时间,“text”通常意味着ASCII(至少是最不常见的分母)。许多用C语言编写的软件将这种ASCII字符串表示为char*
类型。这导致内存要求的或多或少精确匹配:输入文件中的每个字节在加载到RAM时将占用一个字节。
但随着Unicode的兴起,这种情况在过去几年发生了变化。由简单的Java程序(并且使用Java的String
类型很可能)加载的相同文本文件将占用两倍 RAM的数量。之所以这样,是因为Java String
类型在内部使用UTF-16表示每个字符(每个字符最少16位),而ASCII每个字符只使用一个字节。
我在这里要说的是:你的问题没有简单的答案,总是取决于谁阅读数据以及他将要做什么。
有一件事情经常发生:通过“加载”,数据不会变小。
答案 2 :(得分:1)
您可以使用Memory::Usage编写一个小测试脚本来检查自己。
从其文档的概要:
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问题。
答案 3 :(得分:0)
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
返回值。它是文件的大小(以字节为单位)。如果要将整个文件粘贴到内存中,则至少需要$ size字节。然后,您可能需要更多(甚至更少),具体取决于您对文件内容的处理方式。