以下面的代码为例:
for i := (myStringList.Count - 1) DownTo 0 do begin
dataList := SplitString(myStringList[i], #9);
x := StrToFloat(dataList[0]);
y := StrToFloat(dataList[1]);
z := StrToFloat(dataList[2]);
//Do something with these variables
myOutputRecordArray[i] := {SomeFunctionOf}(x,y,z)
//Free Used List Item
myStringList.Delete(i);
end;
//Free Memory
myStringList.Free;
您将如何使用例如OmniThreadLibrary来并行处理此问题?可能吗?还是需要进行重组?
我在每次迭代时都调用
myStringList.Delete(i);
,因为StringList
很大,每次迭代后使用后释放项目对于最小化内存使用很重要。 最佳答案
简单的答案:您不会。
涉及更多的答案:在并行化操作中,您要做的最后一件事是修改共享状态,例如此delete调用。由于不能保证每个任务都会“按顺序”完成-实际上,他们很可能至少不会一次完成,因此您添加到总工作量中的任务越多,这种可能性很快就会接近100%,试图做类似的事情正在玩火。
您可以在销毁项目时对其进行序列化,也可以并行进行,以更快地完成并销毁整个列表。但是我不认为有两种方法都可以做到。