将文件加载到PHP时的内存使用情况

将文件加载到PHP时的内存使用情况,php,file-io,memory-limit,Php,File Io,Memory Limit,我正在用PHP将一个文件加载到一个数组中。我将文件加载到一个数组中,因为它是一个字典,我想利用二进制搜索来查找我的单词是否在字典中。我尝试了两种不同的方法,因为有一些不同的信息。它们的时间非常相似,出于某种原因,我的1.1MB文件导致PHP使用20MB内存 方法1: <?php echo 'Memory Usage Start: ' . memory_get_usage() . '<br>'; $start = microtime(true); $fs=

我正在用PHP将一个文件加载到一个数组中。我将文件加载到一个数组中,因为它是一个字典,我想利用二进制搜索来查找我的单词是否在字典中。我尝试了两种不同的方法,因为有一些不同的信息。它们的时间非常相似,出于某种原因,我的1.1MB文件导致PHP使用20MB内存

方法1:

<?php
    echo 'Memory Usage Start: ' . memory_get_usage() . '<br>';
    $start = microtime(true);
    $fs=fopen("./dictionary.txt", "r");
    $dictionary=array();
    while (!feof($fs)){
        $dictionary[]=trim(fgets($fs));
    }
    $end = microtime(true);
    echo 'Memory Usage End: ' . memory_get_usage() . '<br>';
    echo 'Total Time: ' . ($end - $start) . ' seconds';
方法2:

<?php
    echo 'Memory Usage Start: ' . memory_get_usage() . '<br>';
    $start = microtime(true);
    $dictionary = file('./dictionary.txt', FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);
    $end = microtime(true);
    echo 'Memory Usage End: ' . memory_get_usage() . '<br>';
    echo 'Total Time: ' . ($end - $start) . ' seconds';
在PHP中,数组的开销似乎比我想象的要大得多。我想我能想到的一个解决方案是解析到文件的中间,然后读取那一行,然后以这种方式进行二进制搜索。但是,执行如此多的文件读取以查找值似乎效率要低得多


无论如何,任何洞察都将不胜感激。

每个阵列节点本身就是一个字符串zval,额外的zval开销。尝试将字典加载到数据库中(如果只有SQLite的话,甚至可以简单地加载);您将不会有内存开销,数据库可以被索引,使搜索更容易。我不希望这样,因为它将在一个软件插件中,我希望尽可能避免创建DB表。+1到@MarkBaker。使用表,使其适应主程序数据库。许多插件选择这种方式。在安装和运行时,他们检查框架等,并使用框架数据库和私有表。优点太多了,如果你远离检查和调整例行程序,你会后悔,这是这种方法唯一“表面上”的缺点。使用
file\u get\u contents
它将文件返回到string@Amir,减少内存使用,但您建议如何高效地进行搜索?字符串上的strops()?
<?php
    echo 'Memory Usage Start: ' . memory_get_usage() . '<br>';
    $start = microtime(true);
    $dictionary = file('./dictionary.txt', FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);
    $end = microtime(true);
    echo 'Memory Usage End: ' . memory_get_usage() . '<br>';
    echo 'Total Time: ' . ($end - $start) . ' seconds';
Memory Usage Start: 5297240
Memory Usage End: 25244920
Total Time: 0.074188947677612 seconds