#python-3.x #dask #dask-distributed #dask-delayed #teradatasql
#python-3.x #dask #dask-распределенный #dask-задержка #teradatasql
Вопрос:
Мне нужно прочитать данные большого объема (записи app. 800M) из teradata, мой код работает нормально для миллиона записей. для больших наборов требуется время для создания метаданных. Не мог бы кто-нибудь подсказать, как сделать это быстрее. Ниже приведен фрагмент кода, который я использую для своего приложения.
def get_partitions(num_partitions):
list_range =[]
initial_start=0
for i in range(num_partitions):
amp_range = 3240//num_partitions
start = (i*amp_range 1)*initial_start
end = (i 1)*amp_range
list_range.append((start,end))
initial_start = 1
return list_range
@delayed
def load(query,start,end,connString):
df = pd.read_sql(query.format(start, end),connString)
engine.dispose()
return df
connString = "teradatasql://{user}:{password}@{hostname}/?logmech={logmech}amp;encryptdata=true"
results = from_delayed([load(query,start, end,connString) for start,end in get_partitions(num_partitions)])
Ответ №1:
Время сборки, вероятно, уходит на поиск метаданных вашей таблицы. Это делается путем извлечения всего первого раздела и его анализа.
Вам было бы лучше либо указать его явно, если вы заранее знаете dtypes, например, {col: dtype, ...}
для всех столбцов, либо сгенерировать его из отдельного запроса, который вы ограничиваете таким количеством строк, сколько требуется, чтобы убедиться, что у вас правильные типы:
meta = dask.compute(load(query, 0,10 ,connString))
results = from_delayed(
[
load(query,start, end,connString) for start,end in
get_partitions(num_partitions)
],
mete=meta.loc[:0, :] # zero-length version of table
)