2011-07-20 42 views
0

我想加载一个非常大的文本文件(大小约11 GB)并执行一个函数(基本上将文件分解成不同的部分)。我需要帮助将加载函数多线程化为8个左右的线程,并且在加载函数期间,执行这个特定的排序功能。 (我不能详细讨论sort函数)。C++中的多线程:加载一个大文件并执行一个函数?

这些都在C++中。我没有限制公羊(我有大约60 GB)。

+2

你需要更多的磁盘,而不是更多的CPU。 –

+0

您可以提供有关文件内数据大小的更多详细信息,并在此粘贴一些代码。这将有助于为您的问题提供更合适的解决方案 –

+1

根据Hans Passant的评论,瓶颈容易成为磁盘读取速度。也许需要一些你的记忆,做一个漂亮的VDISK,或者使用一个快速的SSD。这应该有助于将瓶颈转移回您的CPU。 –

回答

0

你可以将文件分割成块并将加载函数传递给fseek偏移量,这样你的加载函数就可以从fseek开始的文件中读取一段时间(并将其加载到内存中),然后在线程(使用您的秘密排序算法)。因此,让我们说,把文件大小除以8并计算fseek偏移量,或者您可以采用固定大小的块并读取,直到用完文件内容来处理(映射11gb的HD内容到RAM需要一段时间并且相当多资源,所以你可能想要做这个增量)。你能理解这个吗?

+0

嗯......我们可以试试。我们迄今为止所尝试的是让用户输入线程的数量,并将文件以这种方式分成块。你的想法似乎有效,我可以尝试。由于某种原因,当我们放入8个线程时,似乎只有2个线程能够完成他们的工作,一个人声称它几乎是瞬间共享(大约1.2GB),另外5个线程则不做任何事情。至于我们的资源,我没有什么可担心的。 –

+0

我猜是有磁盘争用,因为从磁盘加载1GB是很多页(1GB/4KB),因此操作系统可能需要一段时间才能满足这些请求。你在你的实施中使用fseek,或者你是如何分区的? –

+0

这个解决方案很可能会耗尽磁盘读取缓存,并且使整个过程比全部在单个线程中慢,因为每个线程都会将磁头发送到不同的物理位置。在允许的同时读取数量方面也可能存在控制器限制。所有的硬件都依赖于tbh。 –

0

一个线程可以加载到内存块中,将每个块传递到它自己的线程进行处理,以便可以尽早开始处理。我不认为有多个线程同时尝试从同一个文件中读取是个好主意。

+0

这很有道理,尽管在内存中处理文件的速度比加载文件的速度快,所以在下一个文件甚至有机会启动之前线程可能会完成。取决于I/O与CPU排序有多大的关系。 –

0

解决方案1:预订FILE_SIZE存储器堆中,启动一个线程用于读取该文件,报告回只要读取命中DATA_READED/NUMBER_OF_DESIRED_THREADS_FOR_PROCESSING值开始其处理readed数据的块从存储器中的线程,递增读指针通过DATA_READED/NUMBER_OF_DESIRED_THREADS_FOR_PROCESSING。重复。

解决方案2:预订FILE_SIZE存储器,创建NUMBER_OF_DESIRED_THREADS_FOR_PROCESSING和相同数目的队列,读数(对于磁盘IO再次一个线程)时,当一个组块被readed分配缓冲器指针和数据的大小为处理经由线程的队列一些锁定机制。这样,只要数据可用,所有线程都将开始工作。

汉斯帕桑特是正确的,如果你能使用更多的磁盘,那么你应该分配多个线程读取块

相关问题