问题描述
|
尝试定义这样的数组时:
$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中获得“分段错误”。我在C / C ++中的SO上读到了此类错误,那里可能是内存问题,建议使用malloc()将所有内容加载到堆内存中。在PHP中,我们有这样的工具吗?
即使在小型3d阵列中也会发生这种情况,例如15而不是256(但在15以下工作)。
谢谢!
解决方法
只有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上尝试过,并且没有segfault。因此,已经克服了这一问题,该问题已得到修复,可以在PHP 5.3.7中正常工作。
, 您没有说您正在运行哪个PHP版本。不确定是否可以关联,但是SPLFixedArrays发布了一个错误,6月初在快照中移植了一个修复程序。
您可以对快照尝试代码,看看它是否解决了您的问题(Linux快照或Windows快照)。
, 该段故障可能来自操作系统级别,告诉您已破坏堆栈。话虽如此,您之所以要破坏堆栈,是因为您从循环嵌套中调用了SplFixedArray()多次调用。这就是为什么像您提到的那样,在小型3D阵列中,它也会被破坏的原因。
话虽这么说,如果可能的话,尽量不要有这样的嵌套。这等效于无限递归。更不用说PHP的基础机制仍然是C。
希望能帮助到你!干杯!