Сохранен 32
https://2ch.hk/pr/res/2184580.html
24 декабря Архивач восстановлен после серьёзной аварии. К сожалению, значительная часть сохранённых изображений и видео была потеряна. Подробности случившегося. Мы призываем всех неравнодушных помочь нам с восстановлением утраченного контента!

In-memory db /python/

 Аноним OP 15/10/21 Птн 17:49:48 #1 №2184580 
images.jpg
Двач, нужна помощь.

Предположим в роут вебсервера (fastapi) влетает огромный json. Последующие апи запросы (их много, сотни тысячи) модифицируют эти данные. Пробовал сохранять всё в базу, запросы очень частые, получается медленно.

Нужно как-то держать эти данные в памяти, чтобы можно было с ними работать через апи. Сохранность данных не важна, нужно доставать из памяти и фильтровать по разным критериям. Пробовал редис, но там хрен отфильтруешь, так как key/value. Куда копать ?
Аноним 15/10/21 Птн 17:54:40 #2 №2184586 
>>2184580 (OP)
в чем проблемэ, документацию по numpy и pandas не знаешь где взять?
Аноним 15/10/21 Птн 17:58:36 #3 №2184590 
>>2184586

Не знаю такого. Они дают возможность хранить в памяти что-либо долгосрочно?
Аноним 15/10/21 Птн 18:08:22 #4 №2184604 
Screenshot16.jpg
>>2184590
нет. сохранишь потом отдельным кодом.

Ну еще посмотри на пакетик data.table
Там вроде все поинтереснее.

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

А вообще, почему у тебя база медленная? Ты уверен что ты не тупой?
Аноним 15/10/21 Птн 18:16:05 #5 №2184611 
>>2184604
Не уверен.

Мне нужно сохранять состояния pytest тестов в базу. Тесты очень быстрые. Каждое изменение состояния теста - это запись. Вот я и думаю, будет ли быстрее не сохранять сразу, а держать в памяти. Сохранять уже потом, после того как джоба отработает.
Запись в файлы не вариант.

Насчет скорости. К примеру запускаем 1000 тестов - без записи отработают за доли секунды. С записью выходит уже около 10 секунд. Нужно быстро.
Аноним 15/10/21 Птн 18:16:22 #6 №2184612 
в принципе, сама формулировка "in-memory db" какая-то тупая.
Что значит долговременное хранение памяти ?

посмотри еще вот эти либы
https://plyvel.readthedocs.io/en/latest/user.html#basic-operations
https://github.com/KeyviDev/keyvi
и переосмысли вопрос
Аноним 15/10/21 Птн 18:18:15 #7 №2184616 
>>2184612

Я имел ввиду что все приходящие данные будут лежать в памяти до выключения сервера, и можно с ними работать в любое время.
Аноним 15/10/21 Птн 18:21:23 #8 №2184621 
>>2184611
>Запись в файлы не вариант.
почему? раскрой это.
кто тесты потом обрабатывает?

ты в курсе что в mysql есть несколько вариантов хранилищ, INSERT IGNORE, возможность отключить немедленную запись транзакций и binlog ?

короче, начни с pandas. В любом случае, пригодится.
Аноним 15/10/21 Птн 18:23:33 #9 №2184625 
>>2184621
К примеру у тебя 1000 изменений какой либо записи за секунду. Не будут ли файловые операции тормозить ?
Аноним 15/10/21 Птн 18:27:04 #10 №2184632 
>>2184625
наивная постановка вопроса. зачем обновлять данные, которые будут сразу же перезаписаны?
если тебе нужны логи тестов - храни логи тестов. в базу вставляй большим оператором insert.
кстати, pandas это тоже прекрасно делает.

Ты в стремлении сформулировать задачу как математик потерял все возможности рассуждать об оптимизации.
что вообще обычно делают в таких случаях тестировщики и девопсы? Изучи сначала их опыт
Аноним 15/10/21 Птн 20:33:51 #11 №2184764 
>>2184580 (OP)
sqlite :memory:
Аноним 06/11/21 Суб 08:53:13 #12 №2204325 
если всё же реально нужно так часто обновлять данные, разберись с редисом. инструмент неплохой
Аноним 06/11/21 Суб 12:30:27 #13 №2204400 
>>2184580 (OP)
Redis жииииит есть!
Аноним 20/11/21 Суб 20:44:25 #14 №2218137 
>>2204400
двачую. читаю дискач не пойму почему никто редиску не советует.
Аноним 23/11/21 Втр 08:21:22 #15 №2220151 
>>2184580 (OP)

Не знаю как там сейчас в ваших питухонах, но для го есть много in-memory хранилищ - и kv и с индексами на деревьях и на битмапах, и, о боже с полноценным ACID https://github.com/avelino/awesome-go#database

редиска не нужна, как лишний сетевой запрос
Аноним 25/11/21 Чтв 23:11:28 #16 №2222458 
>>2184611
Пиши в очередь результаты, в другом потоке делай insert в базу. Читаешь-синхронизируй.
Аноним 26/11/21 Птн 12:34:33 #17 №2222693 
про пандас - тупой совет, обработка на стороне любой взрослой бд значительно быстрее.
Ну и сам тред тупой,тс не понимает, чего хочет
Аноним 26/11/21 Птн 15:05:54 #18 №2222803 
>>2184580 (OP)
Что мешает прямо в памяти сервака держать?
Аноним 26/11/21 Птн 16:02:00 #19 №2222836 
>>2222693
ты не прав. при желании можно специально поставить такой тест, что пандас уделает твой Оракл.


Просто ты не умеешь пользоваться pandas.
Аноним 31/12/21 Птн 20:39:33 #20 №2253236 
>>2184580 (OP)
1. Сохраняешь в БД. Можно реляционку вроде Постгреса, а можно в Монг (жсоны ведь)
2. Держишь жсон прямо в памяти Питона, это и есть твой кеш. Когда идут запросы на обновление, обновляешь данные в кеше
3. Раз в минуту записываешь данные из кеша в БД (неблокирующим образом разумеется)
Аноним 05/01/22 Срд 00:53:31 #21 №2256278 
>>2184611
Расскажи подробнее, что значит "1000 тестов" и каким образом они получают/обновляют данные.
Возможно ты локально запускаешь всё и поэтому комп не вывозит одновременно и базу и приложение и тесты.
Как тесты обновляют данные? Они их сначала получают полностью, а потом засылают полностью обновлённый json? Сколько уникальных json-записей? 1000 запросов каждый пишет по 1 уникальному файлу или они все долбят 1 json? И всё такое прочее.
Аноним 05/01/22 Срд 01:03:01 #22 №2256281 
Может скинь исходники, было бы интересно посмотреть. потому что недавно начал разбираться с питоном и его фреймворками. До этого с джавой работал.
Аноним 05/01/22 Срд 01:07:50 #23 №2256285 
>>2184611
Если в памяти нужно, то почему бы и нет. Просто хранишь массив своих объектов (десериализованных из json'a). И когда приходит запрос на обновление какого либо их них делаешь filter(...), находишь нужный объект, обновляешь. Без всяких фреймворков, просто руками.
sage[mailto:sage] Аноним 05/01/22 Срд 21:58:13 #24 №2256823 
>>2184580 (OP)
> нужно доставать из памяти и фильтровать по разным критериям. Пробовал редис, но там хрен отфильтруешь, так как key/value
Так фильтруй по ключу, долбоёб
Аноним 05/02/22 Суб 15:37:43 #25 №2287669 
numbers = [-2, -4, -5, 20, 18]
i = len(numbers)
total = 0
while i >= 0 and numbers < 0:
total += numbers
i -= 1
print (total)

Выдаёт ошибку в 4 строке list index out of range, но i изначально равен 5, да и второе условие соблюдается. Что не так, подскажите.


Аноним 05/02/22 Суб 17:30:01 #26 №2287804 
>>2287669
numbers
Аноним 05/02/22 Суб 17:33:45 #27 №2287812 
>>2184611
Чел, ну инмемори sqlite это БАЗА вообще-то. Как ты штаны сам надеть умудряешься утром?
Аноним 05/02/22 Суб 17:35:33 #28 №2287815 
>>2287669
С нуля элементы считаются, индекс последнего элемента у тебя 4, а длина списка - 5, вот и обращаешься к несуществующему элементу.
Аноним 05/02/22 Суб 17:36:31 #29 №2287818 
>>2184580 (OP)
Если медленно, то значит хуево настроил.
Что за БД? Таблицы как описал? Дай угадаю, ты не умеешь в ORM/asyncio и bulk insert
Аноним 05/02/22 Суб 17:44:15 #30 №2287836 
>>2184580 (OP)
Бери Эрланг. В нем есть встроенные базы данных. Тем более Эрланг прекрасно скейлиться из коробки.

https://dyp2000.gitbooks.io/russian-armstrong-erlang/content/chapter15.html
Аноним 05/02/22 Суб 17:48:52 #31 №2287846 
>>2184580 (OP)
>Нужно как-то держать эти данные в памяти
Arrow.
тредю не читал
Аноним 05/02/22 Суб 19:04:17 #32 №2287969 
>>2287669
>>2287815
спасибо.
comments powered by Disqus

Отзывы и предложения