我有一个加载文件和处理数据的应用程序。假设我要处理10 ... 20个文件。
一些要求,以使问题更清楚:
一个想法是并行使用一些线程池和进程文件。这样有效吗?我的操作系统可以处理来自多个线程的文件访问吗?
我发现了这个问题: Accessing a single file with multiple threads
但是在我的应用程序中,一个线程将访问其“自己的”文件,因此不会发生任何冲突。
在我的应用程序中,我使用的是C ++ / STL,但我想了解有关Linux和Windows上文件系统的一般观点。
答案 0 :(得分:1)
您需要进行基准测试。(在您的情况下,可能值得使用多个线程;但是,在您的情况下,加载速度应如此之快,甚至需要按顺序进行,以使普通用户赢得没有通知)
在许多情况下,当您处理最近访问过的中等大小的文件(例如每个文件小于12兆字节,或者每个文件甚至半个千兆字节)时,这些文件实际上位于page cache中。因此,您将不会访问磁盘本身,并且程序实际上可以在RAM中运行(然后多线程应该有效)。
顺便说一句,Linux具有readahead(2),posix_fadvise(2),madvise(2)来提示内核虚拟内存子系统(即,向页面缓存提供提示)。
如果您的常见用例是访问磁盘本身(例如,由于文件很大,或者因为您之前从未访问过它们,因此它们在页面缓存中不是 ),则多线程将无济于事,因为瓶颈已成为硬件磁盘。
请记住,磁盘(甚至是SSD磁盘)要比RAM慢数千倍,并且它会顺序执行IO操作。
此外,您可能会在parsing文件中花费一些CPU时间。如果那需要大量的CPU,则值得在几个独立的线程中运行。
答案 1 :(得分:1)
根据我的经验,如果数据处理繁重,您将获得更高的性能。在这种情况下,您实际上可以并行执行程序。您还需要知道cpu有多少个核心。拥有比cpu核心更多的线程是不值得的。 如果您的处理是“轻量级”的,则您的线程可能总是在等待磁盘完成读取,而很少获得性能提升。