开发者社区> 问答> 正文

需要用最少的内存使用PHP的类似数组的结构

在我的PHP脚本中,我需要创建一个> 600k整数的数组。不幸的是,我的网络服务器memory_limit设置为32M,因此在初始化阵列时脚本会中止并显示消息

致命错误:在第8行的/home/www/myaccount/html/mem_test.php中,耗尽了33554432字节的允许内存大小(试图分配71字节)

我知道一个事实,PHP不会将数组值存储为纯整数,而是存储为比纯整数值(在我的64位系统上为8个字节)大得多的zvalues。我写了一个小脚本来估算每个数组条目使用多少内存,结果证明它恰好是128个字节。128 !!!我需要> 73M来存储阵列。不幸的是,网络服务器不受我的控制,所以我不能增加该服务器memory_limit。

我的问题是,PHP是否有可能创建使用更少内存的类似数组的结构。我不需要这种结构具有关联性(普通索引访问就足够了)。它还不需要动态调整大小-我确切地知道数组将有多大。同样,所有元素都是相同的类型。就像一个好的旧C阵列一样。 问题来源于stack overflow

展开
收起
保持可爱mmm 2020-02-09 12:11:52 407 0
1 条回答
写回答
取消 提交回答
  • 您将获得的最高内存效率可能是将所有内容存储在字符串中,并以二进制压缩,并对其进行手动索引。

    $storage = '';

    $storage .= pack('l', 42);

    // ...

    // get 10th entry $int = current(unpack('l', substr($storage, 9 * 4, 4))); 如果“数组”初始化可以一口气完成,而您只是从结构中读取,那将是可行的。如果需要大量附加到字符串,则效率极低。即使这样,也可以使用资源句柄来完成:

    $storage = fopen('php://memory', 'r+'); fwrite($storage, pack('l', 42)); ... 这是非常有效的。然后,您可以将该缓冲区读回到变量中并用作字符串,或者可以继续使用资源和fseek。

    2020-02-09 12:12:03
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
阿里云栖开发者沙龙PHP技术专场-RabbitMQ 的延时队列和镜像队列原理与实战-钱文品 立即下载
阿里云栖开发者沙龙PHP技术专场-静态扫描为你的项目上线保驾护航-周梦康 立即下载
阿里云栖开发者沙龙PHP技术专场-直面PHP微服务架构挑战-高驰涛 立即下载