Не удается обработать нехватку памяти

Mozer

Новичок
Не удается обработать нехватку памяти

Скрипт должен раскодировать небольшой бинарник размером до 2mb закодированный классическим md5.

Проблемма в следующем: поскольку иного решения, как загрузить весь файл в переменную и соответственно в память скрипта я не нашел, возникают серьезные проблеммы на хостинге из-за того, что скрипт завершает свою работу сразу же после того, как он, загрузив в память весь файл пытается произвести обработку полученных данных.

Вот и вопрос, как файлик размером всего в 2mb порождает нехватку памяти в скрипте, на который выделено по дефолту аж 8mb. Увеличение этого значения до 30Mb так же не дали результата... Как ни пытался очищать переменные по процессе выполнения, эффекта 0
 

Кром

Новичок
>Скрипт должен раскодировать небольшой бинарник размером до 2mb закодированный классическим md5.

Чего чего?
 

Mozer

Новичок
что чего?

Бинарный файлик в закоденном виде лежит в директории. Скрипт должен прочитать его и раскодировав создать рядом с ним новый уже раскодированный файл
 

untied

Сдвинутый новичок
Проблеммммммма вполне может быть в том, что скрипт банально зависает и отжирает память. Что и не удивительно: ведь он пытается раскодировать файлик, закодированный классическим md5.

Автор, ты случайно не файл passwd раскодируешь? :)
 

Mozer

Новичок
base_64_encode
base_64_decode

вот я чего имел ввиду %)
Пардон за безмозглость
 

Mozer

Новичок
задачу очень долго объяснять придется, поэтому задал аналогичный вопрос, с аналогией к моей проблемме

посоветуйте что сделать, я в панике :(
 

Фанат

oncle terrible
Команда форума
аналогия твоя наналогична только изобретению вечного двигателя :)
 

Mozer

Новичок
В двух словах вопрос выглядит так: как обрабатывать файл, который так или иначе невозможно обрабатывать построчно.
О, как =) Краткология сестра таланта =)
 

Mozer

Новичок
Да это ежику понятно, что fopen() -> fread() :)
Есесьно, что в массив в данном случае весь файл считывать еще хуже...

открыли и считали fread в переменную или массив.
Собсно дальше-то что? Дальше пытаешься изменить содержимое и усе... буфер переполнен
Allowed memory size of x bytes exhausted

-~{}~ 25.04.05 14:02:

вот я о чем. Увеличение размера выделяемой памяти до максимума (по статистике, обычный юних сервер хостера настроен на позволение выдать до 40Mb) на практике не помогает практически: обработать файл в 1Mb в этом варианте теперь можно, но чуть файл больше и опять та же история
 

untied

Сдвинутый новичок
Автор, вот какого фига ты весь файл в память читаешь, а?
Понятия не имею, что ты понимаешь под "изменением содержимого", но даже если первый байт файла нужно поменять в зависимости от последнего байта, то на то есть функции fseek() и ftell(), которые позволяют перемещать курсор по всему файлу.

Делай побайтное чтение, короче. И открывай второй файл на запись, куда будет сливаться измененное содержимое.
 

Кром

Новичок
> на практике не помогает практически: обработать файл в 1Mb в этом варианте теперь можно, но чуть файл больше и опять та же история

Есть у меня мнение, что так как стояло ограничение в 1 Mb так и стоит.
 

Mozer

Новичок
2 Кром
>>Есть у меня мнение, что так как стояло ограничение в 1 Mb так и стоит.

Post Quoted: #463424
---
Увеличение размера выделяемой памяти до максимума на практике не помогает.
---
Не надо из меня дурачка делать.

-~{}~ 25.04.05 14:27:
2 untied
Как тогда к примеру заюзать тот же base_64_decode($data). Как ты себе это представляешь юзая fseek и ftell. Хотя скорее всего я неправ, но не могу представить как подобное "оформить в код" на практике :(
 

untied

Сдвинутый новичок
Mozer, с base_64 элементарно:

3 байта начальных данных занимают в кодровке base64 4 байта. Отсюда следует, что нужно считывать из исходного файла порции-строки по N байтов (причем N > 0 и нацело делится на 3); каждую порцию байт кодируешь base64 и записываешь в файл-источник. Последней из файла-источника будет прочитана порция в X байт (причем X <= N). Эту последнюю строчку тоже кодируешь в base64 и записываешь в файл.

PS. Кодирование порциями байт, кратными трем, нужно для того, чтобы base64 не записывал в конец каждой порции символы-концевики.
 

Mozer

Новичок
касаемо раскодинга ясно, сенк.
Вот только помимо base_64_decode есть еще и свои собсные функции, которые работают со строками

-~{}~ 25.04.05 14:50:

Внутри них используются функции для работы с рег выражениями: eregi ('bla', $data), preg_match и проч, то пореж я файл по три байта ничего они не найдут или вернут неполные совпадения с рег выражением.
Как в этом случае?
 

untied

Сдвинутый новичок
Вообще-то я предлагал резать файл порциями по N байт, где N кратно трем. То есть подойдет и 6, и 9, и 12 байт (ну и т.д.)

Положим тебе нужно отслеживать подстроку длиной L символов (можно даже сказать байт, если файл не в UNICODE). Выбери N такой, чтобы N был кратен трем, и N >= L.

Далее примени буфер двойной длины, то есть длиной 2*N. Читаешь N байт и помещаешь их в буфер, ищешь в них подстроку. Перекодируешь в base_64. Далее нужно сделать сдвиг данных в буфере на N байт (то есть уже прочитанные байты остаются в буфере, но сдвигаются для того, чтобы освободить место для новых N байт). Новые N байт считываются в буфер так, чтобы получилась конкатенация старого содержимого буфера и новой порции байт. Делаешь поиск подстроки по всему буферу.

Такой метод двойного буфера нужен, чтобы не потерять подстроки при нарезке файла на куски. То есть одна часть искомой подстроки может оказаться в первой порции данных, а вторая часть -- в следующей.

Объяснил коряво, но идея должна быть понятна.
 
Сверху