我需要在长字符串中插入短字符串。我的问题是,字符串成本记忆的子字符串......无论如何在没有占用新内存的情况下将字符串长成两行。
$str = "xxx...yyy"; // 10 MB
$insert_str = "insert here";
// now split long string and insert short string
echo substr($str, 0, 5000000); // eats next 5 MB
echo $insert_str;
echo substr($str, 5000000); // eats next 5 MB
我的问题是脚本以致命错误结束:内存不足 但不会,也不能为此
添加额外的内存我不能使用substr_replace ...因为没有替换...插入文本
我无法使用任何文件操作,因为文本是动态生成的(不在文件中)
答案 0 :(得分:0)
你可以尝试substr-replace
,但我不确定它的内存使用情况。
http://php.net/manual/en/function.substr-replace.php
修改强>
Perl更有效地处理字符串操作。将文件输出到服务器上的某个位置后,您需要执行脚本。
$perl = new Perl();
$perl->require("inserter.pl");
如果您使用PHP,另一个好的解决方案是使用preg_replace
。
答案 1 :(得分:0)
事实上,php网站上有人发布了一个类似场景的例子。
$token_symbols = " \t\n";
$str = file_get_contents('10MB.txt'); // 9.75410079956 MB
tokenize($str, $token_symbols); // 9.75426483154 MB
unset($str);
strtok('', ''); // 0.0543975830078 MB
function tokenize($str, $token_symbols, $token_reset = true) {
$word = strtok($str, $token_symbols);
while (false !== $word) {
// do something here...
$word = strtok($token_symbols);
}
if($token_reset)
strtok('', '');
}
以下是一个后续释放内存的示例函数。
答案 2 :(得分:0)
可能是这样的:
$str = "xxx...yyy"; // 10 MB
$insert_str = "insert here";
// now split long string and insert short string
for($i=0;$i<5000000;$i++){
echo $str[$i];
}
echo $insert_str;
$len = strlen($str);
for($i=5000000;$i<len;$i++){
echo $str[$i];
}