Можно ли разделить циклы через файл на множество потоков? - PullRequest
0 голосов
/ 25 августа 2011

Я пытаюсь реализовать решение, которое я получил на другой вопрос, который я задал (/6928469/sozdat-vzlomschik-parolei-dlya-failov-rezervnyh-kopii-iphone). Решение очень простое. Проблема в том, что я использую словарь с около 250 000 слов в нем. Для каждого слова я добавляю буквы и цифры в определенные шаблоны, чтобы получить различные комбинации, которые я обычно использую. Я убрал комбинации, которые редко использую, но у меня все еще есть около 24 комбинаций для каждого слова, поэтому окончательный список слов будет примерно 6 миллионов или около того.

Процесс создания списка очень медленный. Я подумал, может ли многопоточность решить мою проблему. Моя теория состоит в том, что я мог бы сказать 4 темы (я новичок в теме, и не знаю, возможно ли это). В теме 1 я использую первый четвертый словарь, в теме 2 - второй четвертый и т. Д. Каждый поток просматривает слова в своей части словаря и добавляет различные комбинации. Когда каждый поток завершается, он записывает результат в определенные текстовые файлы. Когда все потоки выполнят свою работу, я объединю различные файлы в один большой текстовый файл (со всеми 6 миллионами слов в нем). Тем самым сокращая время обработки в 4. По крайней мере, это то, на что я надеюсь. : =)

Я работаю в C #. Это возможно? Итак, вкратце: возможно ли зацикливаться на разных разделах текстового файла, используя разные потоки в C #? Есть ли что-то особенное, о чем мне следует подумать?

Я постараюсь поэкспериментировать с этим, но любой ваш совет будет высоко оценен.

Ответы [ 2 ]

2 голосов
/ 25 августа 2011

Это вполне возможно, если предположить, что у вас есть быстрые способы разделения списка (я полагаю, что разрыв среднего слова будет плохим).

Но, имейте в виду, потоки ничего не делают, если у вас нет лишней обработкисила, чтобы использовать.Если вы работаете с одноядерным / одноядерным ПК, вы идете так быстро, как можете.Но если у вас есть несколько процессоров (или, по крайней мере, несколько ядер), у этого есть шанс.

Реализация довольно проста.Если вы сейчас делаете это:

ProcessText(fullTextBlock);

, тогда это просто:

ThreadPool.QueueUserWorkItem(ProcessText, textBlock1);
ThreadPool.QueueUserWorkItem(ProcessText, textBlock2);
ThreadPool.QueueUserWorkItem(ProcessText, textBlock3);
ThreadPool.QueueUserWorkItem(ProcessText, textBlock4);
0 голосов
/ 27 августа 2011

Так как это была моя первая попытка использования потоков, я подумал, что могу поделиться решением, которое я реализовал. Если у кого-то есть какие-либо предложения о том, как улучшить это в другой раз, было бы здорово. Я понимаю, что потоки - это большая проблема с использованием потоков, когда они взаимодействуют с одинаковыми методами или переменными. Но я думаю, что я полностью разделил темы. Они используют разные экземпляры класса, который я создал. Так что, если у кого-то есть хороший совет по такому способу использования потоков, я счастлив. : =) Вот код, который я использовал для рендеринга потоков:

 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);
...