[Python]Передать длиннный список по http
От: Mr.Cat  
Дата: 25.08.09 23:36
Оценка:
Дано: 2 машины с питоном, на одной из БД вычитывается длиннный набор данных (много строк, мало столбцов).
Нужно: Минимальным количеством строк кода перегнать по http(s) такой список на другую машину (где он построчно будет обработан) так, чтобы список со 100% гарантией не поднимался целиком в память. Т.е. нужно что-то по простоте использования сравнимое с xml-rpc, но рассчитанное на такой вот юзкейс.
Как лучше поступить?
Re: [Python]Передать длиннный список по http
От: Mr.Cat  
Дата: 26.08.09 00:12
Оценка:
Здравствуйте, Mr.Cat, Вы писали:
MC>Дано: 2 машины с питоном, на одной из БД вычитывается длиннный набор данных (много строк, мало столбцов).
MC>Нужно: Минимальным количеством строк кода перегнать по http(s) такой список на другую машину (где он построчно будет обработан) так, чтобы список со 100% гарантией не поднимался целиком в память. Т.е. нужно что-то по простоте использования сравнимое с xml-rpc, но рассчитанное на такой вот юзкейс.
MC>Как лучше поступить?

Уточню. Длиннный список надо передать в http-ответе.
Re[2]: [Python]Передать длиннный список по http
От: Mr.Cat  
Дата: 26.08.09 00:22
Оценка:
Т.е., понятно, можно по-быстрому навертеть велосипедов с xml-rpc: получить первые N строк, получить очередные N строк и т.п. — но хочется готовенького.
Re[2]: [Python]Передать длиннный список по http
От: hattab  
Дата: 26.08.09 05:13
Оценка:
Здравствуйте, Mr.Cat, Вы писали:

MC>Уточню. Длиннный список надо передать в http-ответе.


Как минимум, ответ должен отдаваться чанками (Transfer-Encoding). Будет ли готова в этому принимающая (да и отдающая тоже) сторона еще вопрос т.к. спека xml-rpc требует наличия Content-Length (что с ее стороны вообще-то не вполне правомерно).
Re: [Python]Передать длиннный список по http
От: netch80 Украина http://netch80.dreamwidth.org/
Дата: 26.08.09 05:13
Оценка:
Здравствуйте, 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")
The God is real, unless declared integer.
Re[3]: [Python]Передать длиннный список по http
От: DemAS http://demas.me
Дата: 26.08.09 06:06
Оценка:
"Mr.Cat" <64543@users.rsdn.ru> writes:

> Т.е., понятно, можно по-быстрому навертеть велосипедов с xml-rpc:

> получить первые N строк, получить очередные N строк и т.п. — но хочется
> готовенького.

Готового не знаю. В одной из своих поделок использовал именно велосипед:
xml-rpc + генераторы.
Posted via RSDN NNTP Server 2.1 beta
Re[2]: [Python]Передать длиннный список по http
От: Mr.Cat  
Дата: 26.08.09 09:37
Оценка:
Здравствуйте, 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, но не очень нравится, что весь результат выборки в этом случае будет поднят в память на питоновском сервере и наверняка еще и на клиенте.
Re[3]: [Python]Передать длиннный список по http
От: Mr.Cat  
Дата: 26.08.09 10:00
Оценка:
Здравствуйте, hattab, Вы писали:
H>Как минимум, ответ должен отдаваться чанками (Transfer-Encoding).
Вот я и ищу какую-нибудь высокоуровневую обертку над этим — не хотелось бы руками работать с http.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.