Доброе время суток. Помогите пожалуйста с задачей. Условия такие:
1. Система «черный ящик» пишет в MS SQL Server данные, данных от 2 до 4 млн. записей ежедневно. Разработчики «черного ящика» предусмотрели, что сервис пишет каждый день в новую таблицу с именами: «table-2013-02-01», «table-2013-02-02», «table-2013-02-03»… и так далее.
2. Для поиска я написал простой скрипт в python с использование Pyodbc, в котором вводные данные: период с такого то числа, по такое, и что искать по какому полю. Сейчас скрипт выполняется в цикле (или с использованием «map») где в запросе меняется имя таблицы. А результаты добавляются в список.
3. Как мне в python распараллелить запрос, например, по 30 запросов за раз (к 30 таблицам) к базе?
P.S. В связи с малым опытом работы с Python, пытался использовать PP (Parallel Python), по аналогии:
f('name_table') — функция принимает имя таблицы, возвращает список.
period = ('table-2013-02-01','table-2013-02-02',...)
jobs = [job_server.submit(f,(input,), (,), («pyodbc»,)) for input in period]
for job in jobs:
job()
Но видимо использую не по месту, да и «вылавливаю» постоянно ошибку аля «unpickle»…
Попробуйте присмотерться к библиотеке multiprocessing, я использую с python 2.7
from multiprocessing import Pool
import os
def main():
pool = Pool(os.sysconf('SC_NPROCESSORS_ONLN'))
result = pool.map(f, range(10))
def f(x):
return x*x
почти стандартный пример.
Я похожим образом параллелю простые действия по ssh на разных машинах, когда нет доступа к puppet.
Правда, в вашем случае все может уперется в скорость чтения из одной базы, но несколько параллельных запросов должна держать…
Я бы еще подумал о том, что старые закрытые по датам таблицы можно выносить в БД, например, на другой машине, и делать запросы там + основной сервер, если надо текущий день.
тогда лучше в кластере несколько SQL серверов и на каждый по пачке запросов. среднее время выполнения запроса на текущем железе какое? час-два-три-шесть?