我有這一塊的代碼:的Parallel.For給index數組的邊界之外在VB.NET
noObjs = 0
Dim oName As String
Dim i As Integer
Dim tripleIndex As Integer = 0
Do While sr.Peek() <> -1
readCSV = sr.ReadLine.Split(sepChar(0))
If readCSV.Length >= 3 Then
oName = readCSV(0)
For i = noObjs - 1 To 0 Step -1
If oName = objNames(i) Then
obIndOfTriple(tripleIndex) = i
Exit For
End If
Next i
If i = -1 Then
objNames(noObjs) = oName
obIndOfTriple(tripleIndex) = noObjs
noObjs += 1
End If
End If
tripleIndex += 1
Loop
sr.Close()
而且我想parallelise這樣:
noObjs = 0
Dim oName As String
Dim i As Integer
Dim tripleIndex As Integer = 0
Dim allData() As String = File.ReadAllLines(in_file)
Parallel.For(0, allData.Count, Sub(k)
readCSV = allData(k).Split(sepChar(0))
If readCSV.Length >= 3 Then
oName = readCSV(0)
For i = noObjs - 1 To 0 Step -1
If oName = objNames(i) Then
obIndOfTriple(tripleIndex) = i
Exit For
End If
Next i
If i = -1 Then
objNames(noObjs) = oName
obIndOfTriple(tripleIndex) = noObjs
noObjs += 1
End If
End If
tripleIndex += 1
End Sub)
然而,我得到一個「指數數組的邊界之外」的:
If oName = objNames(i) Then
我還要在這裏指出objNames()和obIndOfTriple()聲明全球(具有固定大小)。 從一些四處搜索,我明白,這與線程安全有關,儘管我仍然是一個並行的新手。 任何人都可以指向正確的方向嗎? 謝謝。
感謝您的回覆。我懷疑是在跑步與串行實現相比,1000行會導致開銷。問題是noObjs在一種情況下可以是1000,在另一種情況下可以是1000000。爲了彌補這一點,我想如果noObjs <= 100000,例如一個串行實現,併爲任何更高的並行。不幸的是,並行(通常和.NET)對我來說是一個全新的篇章。 – globetrotter
實際上,隨着行數的增加,問題變得更糟,因爲您現在正在切換更多的對象,每個對象都沒有做很多工作。你只能真正的並行化你所擁有的CPU數量。試驗每個並行任務實際上可以有多行......所以如果你有1000個可能每個都有250行要做。再次,框架有一些智慧來確定何時並行化太昂貴,但我不確定它是什麼/何時觸發的。 –
btw你會建議作爲我發佈的系列實現的優化嗎? – globetrotter