Теоретически, вы должны иметь возможность выделить до 2 ГБ памяти с помощью процесса x86 в Windows.Однако есть и другие ограничения на то, сколько вы можете выделить.Критически: фрагментация памяти в доступном адресном пространстве.Поскольку base64_encode
выделяет необходимую память одновременно, вам потребуется достаточно непрерывного адресного пространства для кодирования всей строки.Скорее всего, вам хватит 64-разрядного адресного пространства, поэтому 64-разрядная версия PHP работает просто отлично.
Для получения дополнительной информации в этом ответе: Максимум Javaпамять в Windows XP
Приложение: В моем тестировании я смог выделить лишь немного больше, чем у вас, но меньшие выделения адресов позволили мне приблизиться к этому пределу в 2 ГБ.
Приложение2: Если вам абсолютно необходимо использовать 32-разрядную версию и кодировать в файл, вы можете обойти это в некоторой степени, кодируя несколько кратных 3 байтов, а затем объединить их.
// Example, from memory string to file.
$current_position = 0;
$length = strlen($file);
$outputfile = fopen('testoutput.txt', 'w');
while($current_position < $length) {
fwrite($outputfile, base64_encode(substr($file, $current_position, 60000)));
$current_position += 60000;
}
fclose($outputfile);
Или идти от самого файла к файлу, который выделяет очень мало памяти:
$inputfile = fopen('test.mp4', 'rb');
$outputfile = fopen('testoutput2.txt', 'w');
while( ($str = fread($inputfile, 61440)) !== false ) {
if($str === '') {
break;
}
fwrite($outputfile, base64_encode($str));
$current_position += 61440;
}
fclose($outputfile);