Мне нужно решить проблему, близкую к разбору огромного файла, например, 3 ГБ или выше. Ну, файл структурирован как псевдо XML-файл, как:Продюсер/Потребительский образец Java-путь
<docFileNo_1>
<otherItems></otherItems>
<html>
<div=XXXpostag>
</html>
</docFileNo>
... others doc...
<docFileNo_N>
<otherItems></otherItems>
<html>
<div=XXXpostag>
</html>
</docFileNo>
.......
В недавнем сообщении: "http://stackoverflow.com/questions/4355107/parsing-a-big-big-not-well- сформирован-файл-с-Явы», я обнаружил интересное решение моей проблемы .. Так что я думал, чтобы осуществить свою заявку парсер как многопоточные:
- После собирать в strinbUilder текстового контекст с тегом до < \ html>, я возвращаю Stringbuilder.
- После возврата Stringbuilder я извлекаю текстовое содержимое html-страницы через CSS-правила. Я получаю это с помощью анализатора html, JSOUP http://jsoup.org/. После извлечения содержимого html-страницы я должен сохранить это содержимое в файле.
Так .. Поместите свое внимание на шаге 1) и 2), я думаю, чтобы отделить sequencial шаблон с многопоточной способом, как:
- После прочтения кусок файла (построчно line до получения от .. до < \ html>), я добавляю строку в Stringbuilder.
- Для StringBuilder я создаю поток, поддерживающий код до . 2.1. Разберите html и извлеките текстовое содержимое. 2.2 Сохраните текстовое содержимое в файле.
Так у меня есть сомнения ..
- Сколько Нити я должен создать ?? Возможно ли, что я должен создать поток для всех созданных Stringbuilder? Это не проблема памяти?
- Как я могу сделать, чтобы получить точное количество потоков, которые хорошо работали?
- Как я могу узнать, сколько потоков закончилось? Я должен ждать, что все потоки закончатся, чтобы прекратить мою работу?
Для моих сомнений ... точка 1, я не знаю, как это реально решить. Для точки 2 я думаю, что я мог бы реализовывать потоки, такие как внутренний класс класса, который анализирует файл, и поэтому у меня может быть статический счетчик, увеличенный по завершенным потокам. Что касается пункта 3, я думаю, что это аналогичная точка 2, но я не знаю, как это сделать. Подождите мое приложение ....
Кто-нибудь может мне предложить что-нибудь, чтобы разрешить мои сомнения? thanks :)
Пожалуйста, прекратите кричать. – Oswald
Я чувствую, что название несколько вводит в заблуждение. Я думал, вы спросите что-то, связанное с обменом сообщениями или Design Pattern. – chris
Я сделал что-то очень похожее, разобрав огромные файлы «кусками», а затем потребляя куски с помощью нескольких потоков (кроме того, что мой парсер был очень сложным и, следовательно, довольно медленным). В основном то, что хорошо работает, - это адаптировать количество потоков к числу доступных (виртуальных) ЦП. Если у вас двухъядерный процессор, в большинстве случаев бессмысленно иметь два или более потребительских потока. Если, с другой стороны, у вас есть 16 виртуальных ядер, вам может понадобиться около 16 потребительских потоков. – SyntaxT3rr0r