Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 循环调用OpenTripPlanner的并行化_Python_Multithreading_For Loop_Parallel Processing_Opentripplanner - Fatal编程技术网

Python 循环调用OpenTripPlanner的并行化

Python 循环调用OpenTripPlanner的并行化,python,multithreading,for-loop,parallel-processing,opentripplanner,Python,Multithreading,For Loop,Parallel Processing,Opentripplanner,我有一个python脚本,它调用OpenTripPlanner来计算地理定位点对之间的旅行时间矩阵。python脚本使用for循环为每次出发时间计算一个矩阵,并将其保存为一个单独的.csv文件 我想将此操作并行化以使其更快。尽管这项任务似乎是令人尴尬的并行任务,但我对Python几乎一无所知。从我所读到的,我的直觉是最好的解决方案是使用多线程,将每个spt保持在它的线程中 我真的很感谢你的帮助。一个简单的可重复的例子是可用的 这是python脚本: #!/usr/bin/jython from

我有一个python脚本,它调用OpenTripPlanner来计算地理定位点对之间的旅行时间矩阵。python脚本使用
for循环
为每次出发时间计算一个矩阵,并将其保存为一个单独的
.csv
文件

我想将此操作并行化以使其更快。尽管这项任务似乎是令人尴尬的并行任务,但我对
Python
几乎一无所知。从我所读到的,我的直觉是最好的解决方案是使用
多线程
,将每个
spt
保持在它的线程中

我真的很感谢你的帮助。一个简单的可重复的例子是可用的

这是python脚本:

#!/usr/bin/jython
from org.opentripplanner.scripting.api import OtpsEntryPoint


# Instantiate an OtpsEntryPoint
otp = OtpsEntryPoint.fromArgs(['--graphs', '.',
                               '--router', 'sto'])

# Start timing the code
import time
start_time = time.time()

# Get the default router
router = otp.getRouter('sto')


# Read Points of Destination - The file points.csv contains the columns GEOID, X and Y.
points = otp.loadCSVPopulation('centroids_sto.csv', 'Y', 'X')
dests = otp.loadCSVPopulation('centroids_sto.csv', 'Y', 'X')


for h in range(7, 19):
  for m in range(0,60,30):

    # Create a default request for a given time
    req = otp.createRequest()
    req.setDateTime(2015, 12, 28, h, m, 00)
    req.setMaxTimeSec(3600) # 1h = 3600 seconds , 2h = 7200 seconds
    req.setModes('WALK,TRANSIT,BUS,TRAM,RAIL,SUBWAY')  # ("TRAM,RAIL,SUBWAY,FUNICULAR,GONDOLA,CABLE_CAR,BUS")


    # Create a CSV output
    matrixCsv = otp.createCSVOutput()
    matrixCsv.setHeader([ 'mode', 'depart_time', 'origin', 'destination', 'walk_distance', 'travel_time' ]) # travel_time in seconds

    # Start Loop
    for origin in points:
      print "Processing origin: ", str(h)+"-"+str(m)," ", origin.getStringData('idhex')
      req.setOrigin(origin)
      spt = router.plan(req)
      if spt is None: continue

      # Evaluate the SPT for all points
      result = spt.eval(dests)

      # Add a new row of result in the CSV output
      for r in result:
        matrixCsv.addRow([ 'public transport', str(h) + ":" + str(m) + ":00", origin.getStringData('idhex'), r.getIndividual().getStringData('idhex'), r.getWalkDistance() , r.getTime()])

    # Save the result
    matrixCsv.save('traveltime_matrix_sto_pt_'+ str(h)+"-"+str(m) + '.csv')


# Stop timing the code
print("Elapsed time was %g seconds" % (time.time() - start_time))

你能更明确地说明你想被线程化的部分吗?例如,将其截断为一个函数,例如:
function\u to\u thread
,因为这在线程调用中很有用。@raphael我认为最简单的方法是为每个线程分配一个子集原点。因此,OTP仍将一次处理一个行程时间矩阵(出发时间),但每个核心将处理不同的起点。我认为多线程功能主要集中在代码的这一部分:
req.setOrigin(origin)
spt=router.plan(req)
您的代码太复杂,不容易复制。给我们一个csv和一个更简单的例子。但是,我建议您使用此简易库:。因此,您需要并行化最长的循环(由您决定)。那些日子?时间?要点是什么?然后您复制一个req对象,并使用我发送给您的库并行化函数中的所有内容:))您能更明确地表示您希望线程化的部分吗?例如,将其截断为一个函数,例如:
function\u to\u thread
,因为这在线程调用中很有用。@raphael我认为最简单的方法是为每个线程分配一个子集原点。因此,OTP仍将一次处理一个行程时间矩阵(出发时间),但每个核心将处理不同的起点。我认为多线程功能主要集中在代码的这一部分:
req.setOrigin(origin)
spt=router.plan(req)
您的代码太复杂,不容易复制。给我们一个csv和一个更简单的例子。但是,我建议您使用此简易库:。因此,您需要并行化最长的循环(由您决定)。那些日子?时间?要点是什么?然后复制一个req对象,并使用我发送给您的库并行化函数中的所有内容:)