Дано: 2 машины с питоном, на одной из БД вычитывается длиннный набор данных (много строк, мало столбцов).
Нужно: Минимальным количеством строк кода перегнать по http(s) такой список на другую машину (где он построчно будет обработан) так, чтобы список со 100% гарантией не поднимался целиком в память. Т.е. нужно что-то по простоте использования сравнимое с xml-rpc, но рассчитанное на такой вот юзкейс.
Как лучше поступить?
Здравствуйте, Mr.Cat, Вы писали: MC>Дано: 2 машины с питоном, на одной из БД вычитывается длиннный набор данных (много строк, мало столбцов). MC>Нужно: Минимальным количеством строк кода перегнать по http(s) такой список на другую машину (где он построчно будет обработан) так, чтобы список со 100% гарантией не поднимался целиком в память. Т.е. нужно что-то по простоте использования сравнимое с xml-rpc, но рассчитанное на такой вот юзкейс. MC>Как лучше поступить?
Уточню. Длиннный список надо передать в http-ответе.
Т.е., понятно, можно по-быстрому навертеть велосипедов с xml-rpc: получить первые N строк, получить очередные N строк и т.п. — но хочется готовенького.
Здравствуйте, Mr.Cat, Вы писали:
MC>Уточню. Длиннный список надо передать в http-ответе.
Как минимум, ответ должен отдаваться чанками (Transfer-Encoding). Будет ли готова в этому принимающая (да и отдающая тоже) сторона еще вопрос т.к. спека xml-rpc требует наличия Content-Length (что с ее стороны вообще-то не вполне правомерно).
Здравствуйте, Mr.Cat, Вы писали:
MC>Дано: 2 машины с питоном, на одной из БД вычитывается длиннный набор данных (много строк, мало столбцов). MC>Нужно: Минимальным количеством строк кода перегнать по http(s) такой список на другую машину (где он построчно будет обработан) так, чтобы список со 100% гарантией не поднимался целиком в память. Т.е. нужно что-то по простоте использования сравнимое с xml-rpc, но рассчитанное на такой вот юзкейс. MC>Как лучше поступить?
Как-то недостаточно данных. Например, какая БД и как именно выбираются данные.
Простейший пример — у MySQL есть два режима сделать запрос выборки — данные будут полностью буферизованы на сервере или на клиенте. Без полной буферизации на одной из сторон он не умеет. Для других баз такого не помню, плотно не работал.
Далее, не передавать же данные в плоском виде? Наверняка нужен какой-то грамотный маршаллинг. Например, JSON (чтобы текстовый и в одну строку).
Получим что-то вроде следующего:
cu.execute("select buka from zuka")
while True:
row = cu.fetchone()
if not row:
break
sys.stdout.write(json.write(row))
sys.stdout.write("\r\n")
"Mr.Cat" <64543@users.rsdn.ru> writes:
> Т.е., понятно, можно по-быстрому навертеть велосипедов с xml-rpc: > получить первые N строк, получить очередные N строк и т.п. — но хочется > готовенького.
Готового не знаю. В одной из своих поделок использовал именно велосипед:
xml-rpc + генераторы.
Здравствуйте, netch80, Вы писали: N>Как-то недостаточно данных. Например, какая БД и как именно выбираются данные.
БД postgre. С вопросом полной буферизации на одной из сторон — пока не разбирался (ранее только с ораклом работал, там вроде такого нет).
Про "как именно выбираются данные" немного не понял.
N>Далее, не передавать же данные в плоском виде? Наверняка нужен какой-то грамотный маршаллинг. Например, JSON (чтобы текстовый и в одну строку).
Маршаллинга достаточно примитивного. В выборке — только varchar да числа, вероятно, еще timestamp.
N>Получим что-то вроде следующего: N>
N> cu.execute("select buka from zuka")
N> while True:
N> row = cu.fetchone()
N> if not row:
N> break
N> sys.stdout.write(json.write(row))
N> sys.stdout.write("\r\n")
N>
Ну это понятно.
Хочется с минимальными усилиями передавать строки из выборки по сети на другую машину.
Т.е. схема такая:
машина1 <-- сеть --> машина2 <-- ??? --> сервер postgre
На машине1 — клиентская программа на питоне. На машине2 — "тонкий" сервер (пока тоже на питоне — ибо надо быстро склепать что-то более-менее рабочее), предоставляющий простое api для выборки из БД. Сей "тонкий" сервер должен уметь только принимать запрос от клиента, по нему формировать запрос к базе и возвращать результат запроса.
Я бы не задумываясь взял xmlrpc, но не очень нравится, что весь результат выборки в этом случае будет поднят в память на питоновском сервере и наверняка еще и на клиенте.
Здравствуйте, hattab, Вы писали: H>Как минимум, ответ должен отдаваться чанками (Transfer-Encoding).
Вот я и ищу какую-нибудь высокоуровневую обертку над этим — не хотелось бы руками работать с http.