Pull to refresh

Большие файлы и Sinatra

Ruby *
Недавно столкнулся с интересной проблемой, когда попытка отдать большой файл через Sinatra::Helpers.send_file приводила к отжиранию всей оперативной памяти (типичный размер файла — 14Gb).

Исследование показало, что Sinatra сама читает и отдает файл кусками по 512 байт, но web-сервер thin (а также WEBrick) буферизует вывод в оперативной памяти на своем уровне, что и приводит к таким печальным последствиям.

Для решения проблемы достаточно оказалось перейти на web-сервер Rainbows (web-сервер, базирующийся на коде unicorn, но предназначенный для работы без проксирования, для медленных клиентов и/или сервисов). Но при отдаче больших файлов процесс кушал порядка 30% CPU на одном ядре.

Rainbows позволяет оптимизировать отдачу файлов, используя, к примеру, гем sendfile, который предоставляет соответствующие API операционной системы. Но для этого необходимо, чтобы отдача файла шла через Rack::File API.

В текущей master-ветке Sinatra метод send_file переписали, используя API Rack::File, поэтому мы можем просто бэкпортировать соответствующий функционал в существующие версии гема Sinatra:
Читать дальше →
Total votes 29: ↑26 and ↓3 +23
Views 1.8K
Comments 13

Мгновенный поиск в 75 гигабайтах

PHP *
Sandbox
Речь пойдет о том, как был реализован быстрый поиск по большим объемам данных на этой страничке. Там можно искать пароль по хешу, для игрового сервера PvPGN, и генерировать эти же хеши.
Поиск написан на чистом PHP, без использования модулей и сторонней БД. В принципе, таким образом можно наращивать объемы до многих терабайт, было бы место — скорость от этого не сильно пострадает.

Далее от начала до конца описан весь процесс, который включает в себя брутфорс, создание хеш таблицы, её сортировка и, собственно, поиск.


Читать дальше →
Total votes 143: ↑122 and ↓21 +101
Views 32K
Comments 115

Обработка больших запакованных файлов на Mac и не только

Development for MacOS *
Tutorial
Возникла у меня как-то задача обработать файл с логами. В принципе, задача банальная, я для этого использую Perl и в Linux и в Windows. Но дело в том, что всё это происходит на Mac, файл находится в архиве и он большой. Распакованным, он занимает около 20 ГБ.
Какое будет обычное решение?
Читать дальше →
Total votes 28: ↑18 and ↓10 +8
Views 7.9K
Comments 32