我想知道是否可以從 TZipFile 中同時提取多個檔案。我正在使用德爾福 11。
我玩了一會兒,沒有運氣。我在想一些類似的東西,這是行不通的。
var
z : TZipFile;
begin
z := TZipFile.Create;
z.Open('e:\temp\temp.zip', TZipMode.zmRead);
TParallel.For(1, 0, z.FileCount-1,
procedure(i : integer)
begin
z.Extract(i, 'e:\temp\Unzip');
end
);
z.Free;
end;
更新:我制作了這個關于多執行緒提取的短視頻https://youtu.be/wa7i1bmYgq4。這是一些用于測驗目的的演示代碼。
const
ZipTo = 'E:\Temp\ZipTest';
ZipFile = 'e:\temp\temp.zip';
procedure TForm32.Button3Click(Sender: TObject);
begin
var z := TZipFile.Create;
z.Open(ZipFile, TZipMode.zmRead);
var FileCount := z.FileCount;
z.Free;
var sw := TStopwatch.StartNew;
TParallel.For(1, 0, FileCount,
procedure (i : integer)
begin
var z := TZipFile.Create;
z.Open(ZipFile, TZipMode.zmRead);
z.Extract(i, ZipTo);
z.Free;
end
);
ShowMessage(sw.ElapsedMilliseconds.ToString);
end;
procedure TForm32.Button4Click(Sender: TObject);
begin
var sw := TStopwatch.StartNew;
TZipFile.ExtractZipFile(ZipFile, ZipTo);
ShowMessage(sw.ElapsedMilliseconds.ToString);
end;
單執行緒:3,783ms
多執行緒:1,591 毫秒(大約 2.4 倍改進)
您可以使用SysInternals中的 CacheSet 清除磁盤快取。它似乎在我的機器上產生了大約 100 毫秒的差異。我使用的 zip 檔案大小約為 1GB,包含 6 個視頻檔案。這意味著我使用了六個執行緒(因為它試圖一次提取每個檔案),看起來大約四個對我的機器來說是最佳的,但這將很大程度上取決于磁盤速度和 zip 檔案的內容型別.
uj5u.com熱心網友回復:
我想知道是否可以從 TZipFile 中同時提取多個檔案。
不TZipFile支持并行提取壓縮檔案。
阻止并行提取的最值得注意的問題來自FStream和FFileStream欄位。Delphi 流不支持并行訪問,即使它們支持并行訪問,也不會加快提取操作的速度,因為流上正在進行的任何型別的操作都需要阻止其他操作,直到當前操作完成。
流是狀態完整的實體,流上的每個操作都會更改內部流狀態(當前流位置)。甚至讀操作也會改變狀態,這就是流執行緒不安全的原因,不安全TZipFile也會影響類。
當然,TZipFile類中可能還有其他執行緒不安全的來源,但是一旦你有一個不安全且無法輕易更改(修復)的東西,那么尋找其他潛在問題就沒有意義了。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/503912.html
