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('', '');
}

Ниже приведен пример функции, которая впоследствии освобождает память.

- strtok () PHP инструкция

Вы могли бы попробовать substr-replace, но я не уверен, что это использование памяти. http://php.net/manual/en/function.substr-replace.php

РЕДАКТИРОВАТЬ

Perl обрабатывает строковые операции намного эффективнее. Вам нужно будет выполнить сценарий, как только вы выведете файл в папку на вашем сервере.

$perl = new Perl();
$perl->require("inserter.pl");

Еще одно хорошее решение, если вы работаете в PHP, это использовать preg_replace,

Другие вопросы по тегам