是否可以在64位PHP中使用较小的整数


Is it possible to use smaller Integers in 64bit PHP

我有一个PHP脚本,它从文件1M行中加载一些数据,还有另一个比第一个文件中的数据大得多的文件,大约30M行。所以我将1M行加载到数组中,即$array[$STRINGLOOKUP]=1;迭代超过3000万行,并在$array上的array_key_exist上进行查找。

问题是,在我的笔记本电脑上,32位PHP(2GB限制)一切正常,但在生产的64位PHP上,内存不足(2GB也限制)。我听说使用pack()函数可以降低内存消耗。有人试过吗?有可能/值得一试吗?

<?php
 $index=array();
 foreach($lines as $line){
   $index[$line]=1
 }
 foreach($lines30M as $line){
   list($junk1,$lookup,$junk2) = explode("'t",$line,3);
   if(array_key_exist($index[$lookup]){ 
       //do something
   } 
 }
?>

有人试过吗?有可能/值得一试吗?

没有。

您正在尝试编写DBMS。你认为你能比那些写MySQL、MariaDB、SQLLite、PostgreSQL、MongoDB、GDBM的人做得更好吗。。。。。?

将1M放入数组可能不是最节省内存的方法。对于每个数组单元,要求达到数十个字节。此外,在以下代码中,您需要两次:

foreach($lines as $line){
  $index[$line]=1
}

因为您最终会得到两个数组:$lines$index,它们都包含相同的信息。为什么不坚持使用in_array()而不是array_key_exists()呢?

但我确实同意其他评论,这显然是数据库的工作。类似于通过PDO的SQLite?总有一天你必须学会这些,一旦你知道如何才能做得更多。

我曾尝试将pack()用作练习,但它比普通数组占用更多内存,但有一个SplFixedArray类占用更少内存。虽然这不是为Integers使用更少的内存,而是使用固定的数组长度,这比普通数组消耗更少的内存。

以下是内存使用的示例代码

<?php
$mem = memory_get_usage(1);
$array = array();
for($i=0;$i<100000;$i++){
    $array[$i]=1;
}
$mem1 = memory_get_usage();
echo  ($mem1 - $mem)/1024/1024 . " Mb'n";
// 13.8 Mb
$array2 = array();
for($i=0;$i<100000;$i++){
    $array2[$i]=pack('v',1);
}
$mem2 = memory_get_usage();
echo ($mem2 - $mem1)/1024/1024 . " Mb'n";
// 17.0 Mb
$array3 = new SplFixedArray(100000);
for($i=0;$i<100000;$i++){
    $array3[$i]=1;
}
$mem3 = memory_get_usage();
echo ($mem3 - $mem2)/1024/1024 . " Mb'n";
// 5.3 Mb

如果您事先知道数组的大小,并且可以使用整数作为键(SplFixedArray只支持int作为键),这将极大地节省内存。