Как использовать все процессоры при записи данных в файл используя python?
У меня есть функция код, который по определенной логике записывает данные в Базу данных. Я считываю данные с 2-х файлов построчно и на основании этих данных создаю запись в Базе Данных. Как БД использую ESRI geodatabase.
Но, проблема с том, что для работы мы используем 1 ядро и тратим очень много времени на выполнения этого кода. У меня же 96 ядер и я хочу сэкономить время при использовании всех ядер. Это можно сделать через распаралеливание процессов.
Вот мой код:
Создаю БД и таблицу в ней:
arcpy.CreateFileGDB_management("C:\Users\ivan\CellRebell\ESRI_New_Zeland", "%s.gdb"%Island)
result = arcpy.management.CreateFeatureclass(
"C:\Users\ivan\CellRebell\ESRI_New_Zeland/%s.gdb"%Island,
"esri_square", "POLYGON", spatial_reference=4326)
feature_class = result[0]
arcpy.AddField_management(feature_class, 'ID', 'TEXT')
Записываю данные в таблицу:
with arcpy.da.InsertCursor(feature_class, ['ID','SHAPE@']) as cursor:
with open('%s_long_double.txt'%Island, 'r') as long:
for i in long:
i_1, i_2 = i.split()
with open('%s_short_double.txt'%Island, 'r') as short:
for k in short:
k_1, k_2 = k.split()
coord = [[float(i_1),float(k_1)],[float(i_2),float(k_1)],[float(i_2),float(k_2)],[float(i_1),float(k_2)]]
count+=1
row = ['%s_%s'%(Island, count), coord]
cursor.insertRow(row)
del cursor
Как использовать все ядра для записи данных в файл? Скрипт написан на Python 2.7.
Основная задача, которую я хочу решить - это ускорить процесс записи данных в таблицу через использования всех процессоров.
Спасибо
Ответы (1 шт):
import asyncio
from concurrent.futures import ThreadPoolExecutor
async def gen_values(file):
for s in file:
s1, s2 = s.split()
yield s1, s2
def write(w, i_1, i_2, k_1, k_2):
w.poly([[[float(i_1), float(k_1)], [float(i_2), float(k_1)], [float(i_2), float(k_2)],
[float(i_1), float(k_2)], [float(i_1), float(k_1)]]])
w.record(f'{i_1}_{k_1}_{i_2}_{k_2}')
async def main():
w = shapefile.Writer(f'shapefiles/test/Indonesia')
w.field('Latitude', 'C')
loop = asyncio.get_event_loop()
with ThreadPoolExecutor(max_workers=96) as pool:
with open('long_1_double.txt', 'r') as long:
with open('short_1_double.txt', 'r') as short:
async for i1, i2 in gen_values(long):
async for k1, k2 in gen_values(short):
await loop.run_in_executor(pool, lambda: write(w, i1, i2, k1, k2))
if __name__ == '__main__':
asyncio.run(main())
Если заработает можно попробовать юзнуть from concurrent.futures import ProcessPoolExecutor вместо ThreadPoolExecutor
Поправил код