Доброе всем время суток. Есть задача:
Исходные данные:
Входной поток — набор слов. Для простоты предполагается, что данные хранятся в текстовом файле, но при этом общее количество слов и размер файла заранее неизвестны, т.е. нельзя прочитать в память весь файл целиком. Кодировка — Задается.
Необходимо выполнить разбора входного текста на слова и вычислить частоту встречаемости каждого слова. В качестве "слова" понимается набор символов, состоящий из букв, цифр и символа подчеркивания.
Все остальные символы считаются разделителями.
При проектировании следует исходить из предположения, что создаваемый код будет использоваться в рамках реальной системы.
Требования: расширяемость, производительность, экономия памяти
Результат:
Вывести в текстовый файл список слов со значениями частоты встречаемости.
Должна быть предусмотрена возможность вывода списка, отсортированного по частоте.
Сортировка по словам не требуется.
Язык реализации: Java.
Есть вот такая реализация этой задачи:
Основной класс
Эта реализация работает. Все парсит. Подскажите пожалуйста — как в этой реализации повысить производительность? Основные требования — "Требования: расширяемость, производительность, экономия памяти". Как эти параметры соблюсти? может есть какие-нибудь приемы или паттерны для похожих задач?
Здравствуйте, svsanek, Вы писали:
S>Эта реализация работает. Все парсит. Подскажите пожалуйста — как в этой реализации повысить производительность? Основные требования — "Требования: расширяемость, производительность, экономия памяти". Как эти параметры соблюсти? может есть какие-нибудь приемы или паттерны для похожих задач?
Откажитесь от регулярных выражений. Откройте для себя профайлер. "производительность" и "экономия памяти" взаимоисключающие критерии. Добавьте многопоточную обработку данных.
Здравствуйте, svsanek, Вы писали:
S>Эта реализация работает. Все парсит. Подскажите пожалуйста — как в этой реализации повысить производительность? Основные требования — "Требования: расширяемость, производительность, экономия памяти". Как эти параметры соблюсти? может есть какие-нибудь приемы или паттерны для похожих задач?
Первый вопрос по алгоритму.
Ты читаешь файл в буффер потом на его основе делаешь строку и там ищешь слова. Что будет если конец одного буффера и начало следующего окажется на середине слова? Мне кажется в таком случае у тебя одно слово будет трактоваться как два. Может быть я не прав, код достаточно запутанный.
Второе — писать так программы на java — это плохой тон. Java — это обектно ориентированный язык, а у тебя мало того что все делается из статических метододв так еще и данные все сохранятся и передаются из объекта в объект через статические переменные. Свидетельствует о том что программу то написать ты можешь но java не знаешь. Так что, если хочешь произвести впечатление на потенциальных работодателей, советую код переписать.
S>Эта реализация работает. Все парсит. Подскажите пожалуйста — как в этой реализации повысить производительность? Основные требования — "Требования: расширяемость, производительность, экономия памяти". Как эти параметры соблюсти? может есть какие-нибудь приемы или паттерны для похожих задач?
Если допустимо использование java5+, примените java.util.Scanner. Получите гораздо более простой код, и "экономное" использование памяти.
Маленький коментарий: требования у вас не ахти, абсолютно не раскрыты и не формализованы. Это как написать "интерфейс приложения должен быть удобным".
Если бы например вместо слова "производительность" было сказано "программа должна обрабатывать файл в 10 тыс. слов не более чем за 10 секунд", было бы значительно лучше.
Так им и передайте =)
(ещё меня терзают смутные сомнения — не помогаем ли мы человеку "схалтурить" при трудоустройстве).
Здравствуйте, pagrus, Вы писали:
P>(ещё меня терзают смутные сомнения — не помогаем ли мы человеку "схалтурить" при трудоустройстве).
Нам не все ли равно? Мы работодателям доступ к сайту не ограничиваем. Кому надо — прочитают.
Re[2]: Парсин текстового файла
От:
Аноним
Дата:
29.08.08 14:35
Оценка:
Здравствуйте, pagrus, Вы писали:
S>>Эта реализация работает. Все парсит. Подскажите пожалуйста — как в этой реализации повысить производительность? Основные требования — "Требования: расширяемость, производительность, экономия памяти". Как эти параметры соблюсти? может есть какие-нибудь приемы или паттерны для похожих задач?
P>Если допустимо использование java5+, примените java.util.Scanner. Получите гораздо более простой код, и "экономное" использование памяти.
P>Маленький коментарий: требования у вас не ахти, абсолютно не раскрыты и не формализованы. Это как написать "интерфейс приложения должен быть удобным". P>Если бы например вместо слова "производительность" было сказано "программа должна обрабатывать файл в 10 тыс. слов не более чем за 10 секунд", было бы значительно лучше. P>Так им и передайте =)
P>(ещё меня терзают смутные сомнения — не помогаем ли мы человеку "схалтурить" при трудоустройстве).
Насчет требований — вы правы. Насчет халтуры с работой — глубоко ошибаетесь =) Про сканнер нужно поподробней почитать.
Здравствуйте, svsanek, Вы писали:
S>Эта реализация работает. Все парсит. Подскажите пожалуйста — как в этой реализации повысить производительность? Основные требования — "Требования: расширяемость, производительность, экономия памяти". Как эти параметры соблюсти? может есть какие-нибудь приемы или паттерны для похожих задач?
Регулярные выражения(особенно с вложенными "+" и без якорей) крайне не рекомендуется использовать в узких местах. Надо писать все ручками.
Новости очень смешные. Зря вы не смотрите. Как будто за наркоманами подсматриваешь. Только тетка с погодой в завязке.
There is no such thing as a winnable war.
Re: Парсин текстового файла
От:
Аноним
Дата:
03.09.08 14:57
Оценка:
В EPAM собрался? Welcome!
Добавь джавадоку, ее тут смотрят, вернее смотрят, что ты умеешь ею пользоваться.