尝试定义这样的数组时:
$array = new SPLFixedArray(256);
for ($i = 0; $i < 256; $i++) {
$array[$i] = new SPLFixedArray(256);
for ($j = 0; $j < 256; $j++) {
$array[$i][$j] = new SPLFixedArray(5);
for ($k = 0; $k < 5; $k++) {
$array[$i][$j][$k] = 0;
}
}
}
我只能在CLI中获得“Segmentation Fault”。我在C / C ++中的SO上读到了这样的错误,这可能是一个内存问题,并建议使用malloc()将所有内容加载到堆内存中。在PHP中我们有这样的工具吗?
即使在小的3d数组中也会发生这种情况,例如15而不是256(但在15以下)。
谢谢!
答案 0 :(得分:5)
只有一个PHP错误会出现段错误;你永远不应该那样做。它在PHP 5.3.5上为我分段。我在5.3.6的更改日志中看不到任何内容,表明它已被修复。 (它也为我在5.3.6崩溃。)
作为一种解决方法,您可以这样做:
$array = new SplFixedArray(256 * 256 * 5);
$array[$i * JK + $j * K + $k] = $foo;
JK和K是常数。 JK = $jsize * $ksize;
和K = $ksize
。
无论如何,这可能会比创建3D阵列提供更好的性能。
更新
我在PHP 5.3.7-dev上尝试过,并且没有段错误。因此,手指交叉,它已被修复,并将在PHP 5.3.7中正常工作。
答案 1 :(得分:1)
您没有说出您正在运行的PHP版本。不确定这是否相关,但SPLFixedArrays有bug posted,修复程序在6月初移植到快照中。
您可以针对快照试用代码,看看它是否能解决您的问题,Linux snapshot或Windows Snapshot。
答案 2 :(得分:0)
段错误可能来自操作系统级别,告诉您已经破坏了堆栈。这就是说,你破坏堆栈的原因来自你从循环嵌套调用的SplFixedArray()的多次调用。这就是为什么,就像你提到的那样,在小型3d数组中,它也会被破坏。
话虽如此,如果可能,尽量不要有这样的筑巢。这相当于具有无限递归。更不用说PHP的底层机制仍然是C。
希望它有所帮助!干杯!