2015-06-07 6 views
0

Я написал программу для класса, которая берет данные из URL-адреса, анализирует его для ключевых фраз и затем записывает в текстовый файл фразу, номер строки и номер столбца.Разделение операций чтения/записи улучшает эффективность программы?

В настоящее время я делаю это как единую операцию, в которой URL-адрес отправляется в буфер для чтения, в сканер для анализа, а затем в цикл, в котором каждая строка прочесывается, и ряд условных операторов используется для проверки для присутствия указанных ключевых фраз. Когда совпадение найдено, я пишу в файл.

Файл прочитан примерно в 60 тыс. Строк текста, и он занимает около 4000 мс в среднем, чтобы запустить эту полную операцию от начала до конца. Было бы более эффективно разбить задачи и сначала прочитать файл в структуре данных, а затем вывести результаты в файл, а не делать одновременно оба?

Кроме того, насколько большой эффект будет вытягивать данные из URL-адреса, а не читать его локально? У меня есть возможность сделать и то, и другое, но это будет зависеть от моих скоростных скоростей.

EDIT: Несколько хороший тестовый пример. За неделю мы изменили наш интернет-провайдер и обновили нашу широкополосную скорость от 6 Мбит/с до 30 Мбит/с. Это привело к тому, что среднее время чтения/разбора/записи сократилось до 1500 мс. Интересно видеть, как небольшие отклонения могут влиять на производительность.

+0

Профилируйте свой код. Найдите узкое место –

+0

, большинство из 4000 мс, вероятно, потрачено на алгоритм. поэтому на самом деле не имеет большого значения то, что вы делаете с сетевыми и файловыми операциями, если алгоритм не может быть оптимизирован. Хотя я бы предпочел сначала прочитать во всех данных бесплатные сетевые ресурсы (чтобы они не были связаны длительным процессом синтаксического анализа). Это, вероятно, не имеет большого значения. – ZhongYu

+1

Вам следует избегать чтения целых файлов или содержимого URL-адресов в памяти, где это возможно. Он не масштабируется и не добавляет латентности. – EJP

ответ

2

Это зависит от того, как вы реализуете параллелизм в части хруста данных.

В данный момент вы последовательно читаете все - затем хрустите данные - затем напишите. Поэтому, даже если вы разделили его на 3 потока, каждый из них зависит от результата предыдущего.

Так что, если вы не начнете обрабатывать данные до их полного получения, это не повлияет, а только добавит служебные данные.

Вам нужно будет моделировать производителя/потребителя, например, поток, например. строки читаются индивидуально, а затем помещаются в рабочую очередь для обработки. То же самое для обработанных строк, которые затем помещаются в очередь для записи в файл.

Это позволит проводить параллельные операции чтения/обработки/записи.

Btw - возможно, вы в основном ограничены скоростью чтения файла с URL-адреса, поскольку все остальные шаги выполняются локально и быстрее выполняются порядки величин.

+0

Спасибо за такой продуманный ответ. Вероятно, здесь тривиальный вопрос, но для меня это новая территория, так как моя программа CS, наконец, начинает вникать в настоящую теорию. Назначение, над которым я работал, было только первым в летней сессии, и я предполагаю, что это послужит поводом для обсуждения и продвижения класса вперед. Тем не менее. Раньше я закончил AS в WebDev и выполнил мои требования к передаче Uni, которые оглядываются на него, чувствуя себя настолько механически, что я сейчас занимаюсь этим.Полагаю, с течением времени я буду более активно участвовать в этом. –

Смежные вопросы