我正在尝试实施一个解决方案,我得到了另一个问题(http://stackoverflow.com/questions/7166223/create-password-breaker-for-iphone-backup-files)。解决方案非常直接。问题是我使用的字典大约有25万字。对于每个单词,我都会在某些模式中添加字母和数字,以获得我通常使用的不同组合。我已经拿走了我很少使用的组合,但每个单词仍然有大约24种组合,因此最终的单词列表将大概为600万左右。
创建列表的过程非常缓慢。我在想是否多线程可以解决我的问题。我的理论是我可以说4个线程(我是线程新手,不知道是否可行)。在线程1中,我使用字典的前四分之一,在线程2中使用第二个四分之一,依此类推。每个线程循环遍历字典中的单词,并添加不同的组合。每个线程完成后,它会将结果写入特定于线程的文本文件。当所有线程完成他们的工作时,我会将不同的文件连接成一个大文本文件(其中包含所有600万个单词)。从而切割处理时间为4.至少这是我所希望的。 :=)
我在C#工作。这可能吗?简而言之:是否可以使用C#中的不同线程循环遍历文本文件的不同部分?有什么特别值得我考虑的吗?
我会尝试对它进行试验,但我们非常感谢您提出的任何建议。
答案 0 :(得分:2)
这很可能,假设你有一个快速的方法来划分列表(我假设打破中间词会很糟糕)。
但是,请记住,除非您有足够的处理能力才能使用,否则线程不会执行任何操作。如果您使用的是单CPU /单核PC,那么您的速度就会尽可能快。但是,如果你有多个CPU(或至少有多个核心),那么这有机会。
实施相当简单。如果您目前正在这样做:
ProcessText(fullTextBlock);
那就是:
ThreadPool.QueueUserWorkItem(ProcessText, textBlock1);
ThreadPool.QueueUserWorkItem(ProcessText, textBlock2);
ThreadPool.QueueUserWorkItem(ProcessText, textBlock3);
ThreadPool.QueueUserWorkItem(ProcessText, textBlock4);
答案 1 :(得分:0)
由于这是我第一次尝试使用线程,我想我可能会分享我实现的解决方案。如果有人对如何在另一个时间内改进这一点有任何建议,这将是伟大的。我对线程的理解是,当它们与相同的方法或变量交互时,使用线程可能是一个大问题。但我认为我完全分开了线程。他们正在使用我创建的类的不同实例。所以,如果有人对这种使用线程的方式有一些好的建议,我很高兴。 :=)这是我用来渲染线程的代码:
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;
}
这是保存渲染密码的代码(在PasswordRendering类中):
File.WriteAllText(dictionariesFilePath + saveFileName, newContent);