我需要将短字符串插入到长字符串中。我的问题是,字符串的子字符串占用内存。。。不管怎样,把长长的绳子一分为二都不会吃掉新的记忆。
$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
我的问题是脚本以致命错误结尾:内存不足但不要不会也不能为这个添加额外的内存
我无法使用substra_replace。。。因为没有任何东西被取代。。。插入文本
我不能使用任何文件操作,因为文本是动态生成的(不在文件中)
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('', '');
}
以下是一个稍后将释放内存的示例函数。
--strtok()PHP手动
可以这样做:
$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];
}
您可以尝试substr-replace
,但我不确定它的内存使用情况。http://php.net/manual/en/function.substr-replace.php
编辑
Perl处理字符串操作的效率要高得多。一旦将文件输出到服务器上的某个位置,就需要执行脚本。
$perl = new Perl();
$perl->require("inserter.pl");
如果您使用PHP,另一个好的解决方案是使用preg_replace
。