Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C+中的多线程+;:加载一个大文件并执行一个函数?_C++_Multithreading_Algorithm_Sorting_Load - Fatal编程技术网

C++ C+中的多线程+;:加载一个大文件并执行一个函数?

C++ C+中的多线程+;:加载一个大文件并执行一个函数?,c++,multithreading,algorithm,sorting,load,C++,Multithreading,Algorithm,Sorting,Load,我试图加载一个非常大的文本文件(大约11GB大小)并执行一个函数(基本上将文件分成不同的部分)。我需要帮助将加载函数多线程化为8个左右的线程,在加载函数期间,预执行这个特定的排序函数。(关于排序函数,我不能详细讨论太多) 这都是C++的。我在ram方面没有限制(我有大约60 GB)。您可以将文件划分为块,并向加载函数传递一个fseek偏移量,以便加载函数可以从fseek开始读取一段长度的文件(并将其加载到内存中),然后在线程中操作该信息(使用您的秘密排序算法)。比如说,取文件大小,除以8,然后计

我试图加载一个非常大的文本文件(大约11GB大小)并执行一个函数(基本上将文件分成不同的部分)。我需要帮助将加载函数多线程化为8个左右的线程,在加载函数期间,预执行这个特定的排序函数。(关于排序函数,我不能详细讨论太多)


这都是C++的。我在ram方面没有限制(我有大约60 GB)。

您可以将文件划分为块,并向加载函数传递一个fseek偏移量,以便加载函数可以从fseek开始读取一段长度的文件(并将其加载到内存中),然后在线程中操作该信息(使用您的秘密排序算法)。比如说,取文件大小,除以8,然后计算fseek偏移量,或者取固定大小的块并读取,直到要处理的文件内容用完为止(将11gb的HD内容映射到RAM需要一段时间和相当多的资源,因此您可能希望以增量方式执行此操作)。这对您有意义吗?

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

解决方案1:在堆上保留
文件大小
内存,启动一个线程读取文件,一旦读取到达
DATA\u READED/NUMBER\u OF \u DESIRED\u THREADS\u FOR \u PROCESSING
值启动一个处理内存中读取数据块的线程,按
DATA\u READED/NUMBER\u OF \u DESIRED\u THREADS\u FOR \u PROCESSING
增加读取指针。重复

解决方案2:保留
文件大小
内存,创建
所需线程数(用于)处理
和相同数量的队列,在读取块时(同样是磁盘IO的一个线程),通过某种锁定机制将要处理的缓冲指针和数据大小分配到线程队列。这样,一旦数据可用,所有线程都将立即开始工作


Hans Passant是对的如果你可以使用更多的磁盘,那么你应该分配多个线程来读取数据块

你需要更多的磁盘,而不是更多的CPU。你可以提供关于文件中数据大小的更多细节,并在这里粘贴一些代码。这将有助于为您的问题提供更合适的解决方案根据Hans Passant的评论,瓶颈可能是磁盘读取速度。可能会占用一些内存,制作一个漂亮的大VDISK,或者使用快速SSD。这将有助于将瓶颈转移回您的CPU。。。我们可以试试。到目前为止,我们尝试的是让用户输入线程的数量,并以这种方式将文件划分为块。你的想法似乎有效,我可以试试。出于某种原因,当我们放入8个线程时,似乎只有2个线程完成了它们的工作,其中一个线程声称它几乎是在瞬间完成了共享(约1.2GB),而另5个线程则什么也不做。至于我们的资源,我没什么好担心的。我猜是因为从磁盘加载1gb需要很多页面(1gb/4KB),所以操作系统可能需要一段时间来满足这些请求。您在实现中是否使用了fseek,或者您是如何分区的?很可能此解决方案只会耗尽磁盘读缓存,并使整个过程比全部在单个线程中慢,因为每个线程都会将磁盘头发送到不同的物理位置。在允许的同时读取的数量上也可能存在控制器限制。所有这些都有点依赖于硬件。操作系统将命令bio以最线性的顺序读取,但每个bio都将按顺序读取,也可能只是分块读取并发送给处理。这是有道理的,尽管在内存中处理文件一次比加载文件快,因此线程可以在下一个甚至有机会开始。取决于I/O与排序在CPU上的比重。