import osrm
import pandas as pd
import time
import multiprocessing
import concurrent.futures
import threading
path = 'Coordinates/Coordinates_ma_week1_correct.xlsx'
df_coordinates = pd.read_excel(path)
df_coordinates = df_coordinates[['Longitude', 'Latitude']]
list_coordinates = df_coordinates.values.tolist()
list_coordinates = list_coordinates[:100]
duration_matrix=[]
MyConfig = osrm.RequestConfig
osrm.RequestConfig.host = "router.project-osrm.org"
def get_durations(destinations, origin):
tmp_duration = []
start1 = time.time()
for _ in range(10):
try:
result = osrm.simple_route(
origin, destinations,
output='route', overview="simplified", geometry='wkt', url_config=MyConfig)
tmp_duration.append(result[0]["duration"])
break
except:
time.sleep(10)
print("sleeping")
pass
else:
print("ran 10 times")
raise
end1 = time.time()
print('processed customer: ', origin,destinations, " in: ", end1-start1, " seconds")
print("")
return tmp_duration
def main():
start = time.time()
with concurrent.futures.ThreadPoolExecutor(max_workers=30) as executor:
duration_matrix = [[executor.submit(get_durations,origin,destination) for origin in list_coordinates] for destination in list_coordinates]
print("hallo??")
print(duration_matrix)
duration_matrix = pd.DataFrame(duration_matrix)
end = time.time()
print(duration_matrix)
print('Done! How long did it all take?', end - start)
if __name__ == '__main__':
main()
Итак, у меня есть файл, в котором я хочу получить продолжительность между всеми координатами. Поскольку делать это по одному медленно, я хочу использовать ThreadPoolExecutor. По какой-то причине, если я использую строку list_coordinates = listcoordinates [: 50], она работает отлично и ускоряет код. Но если я делаю это для 100 координат (list_coordinates = list_coordinates [: 100]), по какой-то причине он выполняет почти все вычисления. Но где-то это заканчивается. Не знаю где, но вроде ждет, так как код «все еще работает». Код не закончен, но почти все расчеты выполнены. Он не зависит от координат, так как работает для медленного кода на 380 координат. OSRM - это, кстати, система, в которой вы можете запрашивать продолжительность поездки из реальных дорожных сетей (например, googlemaps).
Кроме того, я переписываю это в следующий код (при использовании executeor.map ()), где та же проблема происходит:
import osrm
import pandas as pd
import time
import multiprocessing
import concurrent.futures
import threading
path = 'Coordinates/Coordinates_ma_week1_correct.xlsx'
df_coordinates = pd.read_excel(path)
df_coordinates = df_coordinates[['Longitude', 'Latitude']]
list_coordinates = df_coordinates.values.tolist()
list_coordinates = list_coordinates[:100]
duration_matrix=[]
MyConfig = osrm.RequestConfig
osrm.RequestConfig.host = "router.project-osrm.org"
def destinations(origins):
tmp_duration = []
start1 = time.time()
for destinations in list_coordinates:
for _ in range(10):
try:
result = osrm.simple_route(
origins, destinations,
output='route', overview="simplified", geometry='wkt', url_config=MyConfig)
tmp_duration.append(result[0]["duration"])
break
except:
time.sleep(10)
print("sleeping")
pass
else:
print("ran 10 times")
raise
end1 = time.time()
print('processed customer: ', origins, " in: ", end1-start1, " seconds")
print("")
duration_matrix.append(tmp_duration)
return tmp_duration
def main():
start = time.time()
with concurrent.futures.ThreadPoolExecutor(max_workers=30) as executor:
duration_matrix = executor.map(destinations,list_coordinates, timeout=180)
print("hallo??")
duration_matrix = pd.DataFrame(duration_matrix)
end = time.time()
print(duration_matrix)
print('Done! How long did it all take?', end - start)
if __name__ == '__main__':
main()