我正在学习如何使用TPL来简化我的应用程序。应用程序处理ZIP文件,提取其中保存的所有文件并将内容导入数据库。可能有几千个zip文件等待在给定时间处理。
我是否正确为每个ZIP文件启动单独的任务,或者这是使用TPL的低效方式?
感谢。
答案 0 :(得分:4)
这似乎是一个更适合使用ThreadPool而不是TPL管理的工作线程(每个文件的单独线程)的问题。当您可以对单个数据项进行分割和征服时,TPL非常有用,但您的zip文件是单独处理的。
光盘I / O将成为您的瓶颈,所以我认为您需要限制同时运行的作业数量。使用工作线程管理它很简单,但是我不确定你对并行有多少控制(如果不是),对于并行性如何同时进行,这可能会阻塞你的进程并实际上减慢它的速度。
答案 1 :(得分:1)
只要您有长时间运行的过程,通常可以通过为每个输入任务创建不同的线程来在多处理器系统上获得额外的性能。所以我会说你最有可能走正路。
答案 2 :(得分:1)
我原以为这取决于进程是否受CPU或磁盘的限制。如果这个过程受到磁盘的限制,我认为开启太多线程可能是一个坏主意,因为各种提取可能只是相互竞争。
这就像你可能需要衡量的东西,以获得最佳的答案。
答案 3 :(得分:0)
我不得不同意这些人的某些陈述。
首先,我认为ThreadPool和Tasks在协调或控制方面没有任何区别。特别是当任务在ThreadPool上运行并且您可以轻松控制任务时,异常会在等待或等待Tasks.WhenAll(任务)等期间很好地传播给调用者。
其次,I / O不一定是这里唯一的瓶颈,取决于压缩数据和压缩级别,ZIPping将花费更多时间,而不是从光盘读取文件。
可以从许多方面考虑,但我最好选择CPU核心数量或更少的内容。
将文件路径加载到ConcurrentQueue,然后允许运行的任务将文件路径出列,加载文件,压缩文件,保存它们。
从那里你可以调整核心数量并使用负载平衡。
我不知道ZIP是否支持压缩期间的文件分区,但在某些高级/复杂的情况下,特别是在大型文件上可能是个好主意......
哇,这是6岁的问题,真可惜!我没注意到...... :)