Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ember.js/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
Multithreading 是否可以将文件中的循环拆分为多个线程?_Multithreading_Loops_Text Files - Fatal编程技术网

Multithreading 是否可以将文件中的循环拆分为多个线程?

Multithreading 是否可以将文件中的循环拆分为多个线程?,multithreading,loops,text-files,Multithreading,Loops,Text Files,我正试图实现一个解决方案,我问了另一个问题(http://stackoverflow.com/questions/7166223/create-password-breaker-for-iphone-backup-files ). 解决办法非常简单。问题是我正在使用一本大约有25万字的字典。对于每个单词,我都以特定的模式添加字母和数字,以获得我通常使用的不同组合。我已经去掉了我很少使用的组合,但是每个单词仍然有大约24个组合,因此最终的单词列表大约是600万个左右 因此,创建列表的过程非常缓慢。

我正试图实现一个解决方案,我问了另一个问题(http://stackoverflow.com/questions/7166223/create-password-breaker-for-iphone-backup-files ). 解决办法非常简单。问题是我正在使用一本大约有25万字的字典。对于每个单词,我都以特定的模式添加字母和数字,以获得我通常使用的不同组合。我已经去掉了我很少使用的组合,但是每个单词仍然有大约24个组合,因此最终的单词列表大约是600万个左右

因此,创建列表的过程非常缓慢。我在想多线程是否可以解决我的问题。我的理论是我可以说有4个线程(我是线程新手,不知道这是否可能)。在线程1中,我使用字典的前四分之一,在线程2中使用第二个四分之一,依此类推。每个线程循环遍历字典中的单词,并添加不同的组合。当每个线程完成时,它会将结果写入特定于线程的文本文件。当所有线程都完成它们的工作后,我会将不同的文件连接到一个大文本文件中(其中包含所有600万字)。从而将处理时间缩短为4。至少这是我所希望的。:=)

我在C#工作。这可能吗?简而言之:在C#中使用不同的线程是否可以循环遍历文本文件的不同部分?我有什么特别需要考虑的吗


我会尝试尝试一下,但是非常感谢你的任何建议。

如果你有一个快速划分列表的方法,这是很有可能的(我认为打破中间的单词是不好的)

但是,请记住,除非您有多余的处理能力来使用,否则线程什么也做不了。如果您使用的是单CPU/单核PC,您将以最快的速度运行。但是,如果您有多个CPU(或至少多个内核),那么这是有机会的

实现起来相当简单。如果您当前正在执行此操作:

ProcessText(fullTextBlock);
那就是:

ThreadPool.QueueUserWorkItem(ProcessText, textBlock1);
ThreadPool.QueueUserWorkItem(ProcessText, textBlock2);
ThreadPool.QueueUserWorkItem(ProcessText, textBlock3);
ThreadPool.QueueUserWorkItem(ProcessText, textBlock4);

由于这是我第一次尝试使用线程,我想我可以分享我实现的解决方案。如果有人对如何在下次改进这一点有任何建议,那就太好了。我对线程的理解是,当线程与相同的方法或变量交互时,使用线程可能是一个大问题。但我想我确实把线完全分开了。他们正在使用我创建的类的不同实例。因此,如果有人对这种使用线程的方法有一些好的建议,我很高兴。:=)下面是我用来渲染线程的代码:

 for (int i = 0; i < threads; i++)
            {
                string errorFileName = "errorFile" + (i + 1) + ".dic";
                string saveFileName = "english" + (i + 1) + ".dic";
                string logfileName = "error.log";
                string[] currentContent;
                if (i != threads - 1)
                {
                    currentContent = contentArrayOriginal.Skip(skipStrings).Take(takeStrings).ToArray();
                }
                else
                {
                    int skip = skipStrings;
                    int take = numberOfWords - skip;
                    currentContent = contentArrayOriginal.Skip(skip).Take(take).ToArray();
                }
                PasswordRendering passRender = new PasswordRendering(rootFilePath, errorFilePath, dictionariesFilePath, currentContent, versionsMain, errorFileName, saveFileName, logfileName, (i + 1));
                Thread thread = new Thread(new ThreadStart(passRender.SetPasswords));
                thread.Start();
                skipStrings += takeStrings;
            }

非常感谢您的快速回答,詹姆斯!:=)恐怕我是在单核电脑上。所以在使用单核电脑时不能使用多线程?我的想法是说4种不同的方法:getPassword1(),getPassword2()等等。它们不太面向对象,因为它们会做同样的事情。但这只是这一次(希望;=),所以我认为这可能是一个简单的解决方案。然后我会让每个线程调用它自己单独的方法。但如果我理解你,那是不可能的?嘿,詹姆斯!我创建了一个简单的控制台应用程序,在这里我可以选择要使用多少线程。我试着用100条线,效果很好。我记下了处理一定数量的单词的时间,当使用多个线程时,时间大大缩短。为了避免冲突,我将原始密码文件分成了相等的部分。每个线程根据其分区创建密码,然后将结果写入自己的文件。只有在与相同的方法和变量交互时,线程才会构成威胁吗?James,我在stackoverflow上没有足够的“可信度”来支持你的答案,但我还是竖起大拇指!:=)
File.WriteAllText(dictionariesFilePath + saveFileName, newContent);