php substr без использования памяти
Мне нужно вставить короткую строку в длинную строку. Моя проблема в том, что подстрока памяти стоимости строки... в любом случае скольжение длинной строки в две, не съедая новую память.
$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... потому что ничего не заменено... вставлен текст
Я не могу использовать файловую операцию, потому что текст генерируется динамически (не в файле)
3 ответа
Можно сделать так:
$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];
}
Так случилось, что кто-то на сайте 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('', '');
}
Ниже приведен пример функции, которая впоследствии освобождает память.
Вы могли бы попробовать substr-replace
, но я не уверен, что это использование памяти. http://php.net/manual/en/function.substr-replace.php
РЕДАКТИРОВАТЬ
Perl обрабатывает строковые операции намного эффективнее. Вам нужно будет выполнить сценарий, как только вы выведете файл в папку на вашем сервере.
$perl = new Perl();
$perl->require("inserter.pl");
Еще одно хорошее решение, если вы работаете в PHP, это использовать preg_replace
,