我有很多(>100k)相对较小的文件(1kb - 300kb),需要读取和处理。我目前正在循环遍历所有文件,并使用
我已经尝试使用多线程,但由于这似乎是IO绑定的,我没有看到任何改进。
File.ReadAllText
读取内容,进行处理,然后读取下一个文件。这很慢,我想知道是否有一种好的优化方法。我已经尝试使用多线程,但由于这似乎是IO绑定的,我没有看到任何改进。
File.ReadAllText
读取内容,进行处理,然后读取下一个文件。这很慢,我想知道是否有一种好的优化方法。我会将处理过程放到一个单独的线程中进行。我会读取文件并将数据存储在队列中,然后读取下一个文件。
在第二个线程中,让线程从队列中读取数据并进行处理。看看是否有帮助!
磁盘寻道时间可能是限制因素之一(这是进行Make时最常见的瓶颈之一,通常涉及大量小文件)。愚蠢的文件系统设计具有目录条目并坚持为文件指定磁盘块的指针,这保证了每个文件至少需要1次寻道。
如果您使用的是Windows,我建议切换到使用NTFS(它将小文件存储在目录条目中,从而每个文件可以节省一个磁盘寻道)。我们也使用磁盘压缩(更多计算但CPU便宜且快速,但磁盘空间较少-->读取时间较少);如果您的文件都很小,则可能与此无关。如果您使用的是Linux,则可能存在相应的文件系统等效物。
是的,您应该启动一堆线程来读取文件:
forall filename in list: fork( open filename, process file, close filename)
你可能需要对此进行节流以防止线程耗尽,但我建议你至少使用数百个线程而不是仅有2或3个。如果这样做,你就告诉操作系统可以在磁盘上读取很多位置,并且可以通过磁盘位置(电梯算法)对多个请求进行排序,这也有助于最小化磁头运动。
我同意Reed和Icemanind的评论。此外,请考虑如何提高磁盘IO。例如,将文件分散到多个磁盘上,以便可以并行读取,并使用更快的磁盘,如固态硬盘或者RAM盘。