parser

Написать ответ на текущее сообщение

 

 
   команды управления поиском

(Давненько не брал я в руки шашек) Base64 и "failed to allocate"

Sanja v.2 05.11.2010 22:46

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

Сделал в Google Chrome расширение, которое рендерит открытую страницу в PNG и upload'ит её через HTTP POST. На сервер бросил следующий файлик:
@main[]

$base64[$form:[data]]
$ext[$form:type]

#отпиливаем от начала строки текст "data:image/png;base64,"
^if($ext eq "png"){$base64[^base64.mid(22)]}
^if($ext eq "jpg"){$base64[^base64.mid(23)]}

^memory:compact[]

# преобразуем base64 в файл:
$decoded[^file::base64[$base64]]
$base64[]

^memory:compact[]

# отправляем на Twitpic.com:
^mail:send[
      $.from[xxx <xxx@bougakov.com>]
      $.to[yyy@twitpic.com]
      $.subject[$form:imageUrl]
      $.text[ ]
			$.file[
			    $.value[${decoded}]
			    $.name[temp.${ext}]
			]

]

$result[$form:imageUrl]
Проблема в том, что так мне удаётся сохранять небольшие странички, экрана на три-четыре. Чуть страница больше, и PNG-снимок становится больше пары мегабайт, начинаю ловить

[Fri Nov 5 22:07:56 2010] [69528] out of memory: failed to allocate clean 2145452 bytes. heap_used=25513984, heap_free=16441344, bytes_since_gc=2148268, total_bytes=13221816 [uri=/upload_screenshot.htm, method=POST, cl=2270737]
[Fri Nov 5 22:27:14 2010] [72800] out of memory: failed to allocate clean 8449579 bytes. heap_used=27373568, heap_free=507904, bytes_since_gc=35108232, total_bytes=35108232 [uri=/upload_screenshot.htm, method=POST, cl=9021091]


Где бы ещё пооптимизировать, а?

Переписывать всё на Perl неохота - его я забыл ещё сильнее, чем Парсер...