LINUX.ORG.RU

Быстрое хранилище данных и Python

 , ,


1

4

Здравствуйте, у меня появилась одна нестандартная задача и я не могу понять как её решить.

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

Я загружаю текстовые лог-файлы в БД postgresql и пытаюсь выбирать оттуда, но время выборки составляет около секунды.

Какие ещё есть хранилища для подобной ситуации, чтобы скорость этих хранилищ была максимально высокой. Может быть подойдёт Mongodb?


Мб дело в индексах, секунды - перебор? Около года назад эксперементировал как раз с выборкой логов из постгриса и монги, при дефолтных настрйоках. Монга, в среднем, показала себя быстрее на два порядка, при ~1кк мелких записей/документов.

kryonn
()

питон (да и все скриптовое) это не про скорость же. Но можно посмотреть в сторону редиса (или чего там в ОЗУ хранит)

Dred ★★★★★
()

а если тупо в RAM всё хранить, тогда может и простого SQLite хватит?

zolden ★★★★★
()
Ответ на: комментарий от Dred

питон (да и все скриптовое) это не про скорость же

У него там всё время I/O съело, при чём тут питон или не питон

zolden ★★★★★
()
Ответ на: комментарий от zolden

при том что ему нужны милисикунды, поборет I/O - начнет упираться в это.

простого SQLite хватит

простой или не простой, но при верном использовании может MySQL (ну да, такая себе заслуга) уделывать по скорости

Dred ★★★★★
()

postgres настроен? С дефолтными настройками он тормоз.

pi11 ★★★★★
()
Ответ на: комментарий от Dred

(или чего там в ОЗУ хранит)

Если у него памяти хватает и эта табличка активно юзается и так все в памяти будет сидеть.

pi11 ★★★★★
()
Ответ на: комментарий от Dred

при том что ему нужны милисикунды, поборет I/O - начнет упираться в это.

Ну я щас пример из bottlepy запустил, посмотреть на тормоза питона, вот такой -

from bottle import route, run


@route('/hello')
def hello():
    return "Hello World!"

run(host='127.0.0.1', port=8000)

Результаты такие -


ab -c1 -n1000 http://127.0.0.1:8000/hello
Time per request:       0.408 [ms] (mean)
Time per request:       0.408 [ms] (mean, across all concurrent requests)


ab -c1 -n1000 http://127.0.0.1:8000/hello
Time per request:       5.980 [ms] (mean)
Time per request:       0.598 [ms] (mean, across all concurrent requests)

И это на встроенном веб-сервере. Можно еще ускорить.

pi11 ★★★★★
()
Ответ на: комментарий от pi11

не думай что я хэйтер. Я питон использую везде где это можно. конечно он достаточно быстр в запросах. Просто если у него постгре тормозить умудряется то я логично предположил, что данных сильно много, да и драйвера к БД по опыту сильно медленнее заточеных клиентов

Dred ★★★★★
()
Ответ на: комментарий от Dred

Вангую, что у него постгрес не настроен.

pi11 ★★★★★
()
Ответ на: комментарий от Dred

Он не написал вообще как он хранит данные в нем, есть ли индексы, какие запросы.

Вангую, что для его задачи вообще бд не нужна.

pawnhearts ★★★★★
()
Ответ на: комментарий от kryonn

посгрес на дефолтных настройках это кусок говна. Так что сравнение невалидное.

v9lij ★★★★★
()
Ответ на: комментарий от pawnhearts

Вангую, что для его задачи вообще бд не нужна.

Нужна, только ему скорее всего нужно вытащить из логов адреса и уже уникальные засунуть в базу.

mashina ★★★★★
()

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

ei-grad ★★★★★
()

А точно в памяти это в самом процессе нельзя хранить?

vertexua ★★★★★
()

Ванга моде

Ну, предположим у тебя текстовых логов на 20 гиг. Ты закинул все эти логи в базу sql построчно. И теперь при каждом вызове ты начинаешь парсить эти 20 гиг заново. Ну и откуда у тебя скорость то будет, если ты раз за разом делаешь одну и ту же работу?

Т.е. тебе надо сначала обработать 1 раз 20 гиг, а уже потом результаты обработки записать в базу в виде пар ip + маска сети. И вызовы твои ускорятся в тысячи раз.

justAmoment ★★★★★
()

Всем спасибо, померял time-м скорость работы psql и mongo, однозначно выбираю mongodb, так как она значительно быстрее выбирает мои данные

pup_kin
() автор топика
Ответ на: комментарий от pup_kin

Просто ты не умеешь готовить постгрес.

pi11 ★★★★★
()
Ответ на: комментарий от umren

да лан тебе, видал я этот ваш nodeJS, он уже перестал из коробки всю свободную память сжирать и убиваться oom-killer-ом ?

Dred ★★★★★
()
Ответ на: комментарий от Dred

питон (да и все скриптовое) это не про скорость же. Но

Чойто?

ggrn ★★★★★
()
Ответ на: комментарий от Dred

это в первой альфе было что ли? месяцами на апи работает, жрет очень мало памяти

видал я этот ваш nodeJS

есть обоснованные сомнения на этот счет

umren ★★★★★
()
Последнее исправление: umren (всего исправлений: 1)
Ответ на: комментарий от umren

обоснованные

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

Dred ★★★★★
()
Ответ на: комментарий от Dred

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

umren ★★★★★
()

ipv6 адрес 128 бит. Плюс там около 40 бит на всякие расходы на структуры в Java и hash set. Определяешь подсеть и просто кладешь их в него. Я сомневаюсь что у тебя таблица содержит хотя бы 10^28 значений. Ну в общем большая часть проблем быстро решается hash map/set.

xpahos ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.