我在一个共享上有大约1500个文件,我需要为其收集FileVersionInfo字符串。因此,我在Gateway中创建了一个静态方法,如下所示:
private static string GetVersionInfo(string filepath)
{
FileVersionInfo verInfo = FileVersionInfo.GetVersionInfo(filepath);
return string.Format("{0}.{1}.{2}.{3}", verInfo.ProductMajorPart, verInfo.ProductMinorPart,
verInfo.ProductBuildPart, verInfo.ProductPrivatePart).Trim();
}然后在带有DegreeOfParallelism的PLINQ调用中使用FileAndVersion结构,因为这是与I/O相关的
resultList = dllFilesRows.AsParallel().WithDegreeOfParallelism(20)
.Select(r =>
{
var symbolPath = r.Filename;
return new FilenameAndVersion{Filename=symbolPath, Version=GetVersionInfo(symbolPath)};
})
.ToArray();后来,我将结构FileAndVersion修改为:
private struct FilenameAndVersion
{
private string _version, _filename;
public string Version { get { return _version; } }
public string Filename { get { return _filename; } }
private void SetVersion()
{
FileVersionInfo verInfo = FileVersionInfo.GetVersionInfo(this.Filename);
this._version = string.Format("{0}.{1}.{2}.{3}", verInfo.ProductMajorPart, verInfo.ProductMinorPart,
verInfo.ProductBuildPart, verInfo.ProductPrivatePart).Trim();
}
public FilenameAndVersion(string filename, string version)
{
this._filename = filename;
this._version = string.Empty;
SetVersion();
}}
并使用它:
resultList = dllFilesRows.AsParallel().WithDegreeOfParallelism(20)
.Select(r =>
{
var symbolPath = r.Filename;
return new FilenameAndVersion(symbolPath, String.Empty);
})
.ToArray();问题是,这对我有帮助吗?这是一个很好的模式吗?忘记提到这些文件位于连接了RAID 10和SAN的服务器上。
Sunit
发布于 2010-04-30 22:30:51
如果您的所有文件都在同一磁盘上,并行执行根本不会有任何帮助。一个磁盘一次只能读取一件事,所以你最好忘掉它的并行性,抛弃线程开销,让它按顺序运行。
如果你并行运行它,你最终会得到的只是一个到处乱转的磁盘,最终导致整体读取速度变慢。
如果您的文件位于不同的物理驱动器上(或通过FTP之类的网络),那么可以考虑对并行性进行更多的控制,并将其划分为每个物理磁盘的单个任务。
我的建议是,在你坚定地承诺做一些并行的事情之前,先对其进行基准测试。
发布于 2010-04-30 22:30:05
在处理文件I/O时使用TPL (或任何形式的并行性)实际上更有可能减慢而不是加速执行,除非您有某种方法来保证并行访问的文件位于不同的物理磁盘或固态磁盘上。在顺序I/O方面,磁存储往往比随机访问I/O要好得多(在这里,您实际上是在强制执行)。
但是,像往常一样,您需要分析并实际测量更改的影响。
需要说明的是:为了避免阻塞UI或ASP.NET请求,在后台运行开销很大的文件操作(最好使用I/O完成端口,不幸的是FileVersionInfo没有提供)是一件很好的事情,具体取决于您的环境。然而,这与并行运行它们有很大不同;TPL主要用于CPU密集型任务的并行化,在这种情况下,多个CPU核心可以帮助更快地完成操作。
https://stackoverflow.com/questions/2745121
复制相似问题