如何使用多个线程读取大量文件,请帮助我!
Posted
技术标签:
【中文标题】如何使用多个线程读取大量文件,请帮助我!【英文标题】:How to read large number of files using multiple threads,help me please! 【发布时间】:2010-05-03 13:18:07 【问题描述】:在我的应用程序中有一小部分功能,它会读取文件以获取一些信息,文件数至少为 50,所以我想实现线程。假设用户提供 50 个文件,我想把它分成5 * 10,应该创建5个线程,这样每个线程可以处理10个文件,可以加快处理速度。从下面的代码中你可以看到一些变量是常见的。我读了一些文章关于线程,我知道只有一个线程应该访问我的变量/控制(CCriticalStiuation 可用于此)。对于我作为初学者,我发现很难实现我所学到的关于线程的知识。有人请给我对下面显示的代码有一些想法..在此先感谢
file read function://
void CMyClass::GetWorkFilesInfo(CStringArray& dataFilesArray,CString* dataFilesB,
int* check,DWORD noOfFiles,LPWSTR path)
CString cFilePath;
int cIndex =0;
int exceptionInd = 0;
wchar_t** filesForWork = new wchar_t*[noOfFiles];
int tempCheck;
int localIndex =0;
for(int index = 0;index < noOfFiles; index++)
tempCheck = *(check + index);
if(tempCheck == NOCHECKBOX)
*(filesForWork+cIndex) = new TCHAR[MAX_PATH];
wcscpy(*(filesForWork+cIndex),*(dataFilesB +index));
cIndex++;
else//CHECKED or UNCHECKED
dataFilesArray.Add(*(dataFilesB+index));
*(check + localIndex) = *(check + index);
localIndex++;
WorkFiles(&cFilePath,dataFilesArray,filesForWork,
path,
cIndex);
dataFilesArray.Add(cFilePath);
*(check + localIndex) = CHECKED;
【问题讨论】:
您显示的代码根本没有使用线程。您需要澄清您的问题,以说明您是如何尝试在多个线程之间拆分工作以及出了什么问题。 ***.com/questions/2758189/multi-threading-in-mfc 的可能重复项 另外,我建议使用CString
而不是原始的wchar_t *
和TCHAR *
字符串。但是,如果您确实坚持使用指针,请不要将TCHAR *
与wchar_t *
混合使用——您在if
语句中将TCHAR *
分配给wchar_t
,然后调用wcscpy
。这将适用于 Unicode,但如果您需要在某些时候为 ASCII 构建,这将非常失败。保持一致。
【参考方案1】:
我认为你最好只有一个线程来读取所有文件。在您的示例中,线程之间的上下文切换以及同步问题确实不值得。硬盘是一种资源,所以想象一下所有五个线程轮流将硬盘读取头移动到硬盘上的不同位置 == 不是很有效。
【讨论】:
考虑到每个线程都会阻塞等待磁盘访问,线程之间的上下文切换可以忽略不计。至于读取效率,我认为这取决于访问大小。磁盘并不完全“轮流”;操作系统和控制器上有调度程序。如果所有文件都很小(4 KB 或更小),最好设置 50 个线程,用请求淹没系统,让磁盘调度程序找出如何以最有意义的顺序处理请求。 我可以同意上下文切换,因为花费在 I/O 上的时间无论如何都会占主导地位,但是我真的不认为运行大量线程会有任何好处,因为它们都运行将从本质上是顺序磁盘中读取。类似于如果你有一个收银员,它不会加快 50 条排队到那个收银员的速度。以上是关于如何使用多个线程读取大量文件,请帮助我!的主要内容,如果未能解决你的问题,请参考以下文章
如何确定将大量文件复制到外部共享文件夹的理想并行Java线程数?
如何从 URL 读取 Windows 应用程序中的大量 xml 文件(从 Windows 应用程序到服务器的多个请求)c#