PHP的hash_file是否在内部流式传输?

时间:2013-12-30 18:22:10

标签: php

当我在一个大文件(5GB)上调用hash_file时,我注意到我的机器的内存使用率上升了。操作成功完成,但我想知道hash_file的内部实现是否将文件内容流式传输到哈希算法中,或者它是否尝试首先将整个文件内容加载到内存中。有谁知道吗?

2 个答案:

答案 0 :(得分:3)

它将整个内容映射到虚拟内存中。整个内容必须在物理内存中才能执行散列操作,但不能同时进行。与往常一样,机器的物理内存包含映射到虚拟内存的部分内容,由操作系统管理,以最有效地利用物理内存。

如果您考虑一下,基本上不可避免的是,所有文件的内容在某个时刻都会通过物理内存,以便计算哈希值。必须由CPU处理文件的每个字节以产生散列,因此如果尚未在内存中则必须读取。如果有足够的物理内存,你可能希望它留在那里,因为一个常见的模式是在你对它进行哈希处理后再次读取同一个文件。

如果您散列的文件大于物理内存,则在读取新数据时必须丢弃一些数据。操作系统通过调整虚拟内存的哪些页面实际驻留在物理内存中来管理此操作。包含文件系统中仍然可用的干净数据副本的页面可以从物理内存和用于保存新读取信息的物理内存中轻易丢弃。

答案 1 :(得分:2)

没人回答这个问题,所以我回答了我自己的问题。经过一点测试后发现,hash_file 对文件进行了操作,而不是像file_get_contents那样在内部使用愚蠢的东西。通过使用php_memory_limit值低于正在散列的文件大小的环境进行测试。 (首先应该这样做,对不起噪音。)