![]() |
|
Модераторы: LSD, AntonSaburov |
![]()
|
|
| CSharpProgrammer |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 44 Регистрация: 6.7.2006 Репутация: нет Всего: нет |
Доброго времени суток!
Задача заключается в том чтобы 1) Работать с большим количеством файлов 2) Работать с файлами большого размера (1Гб и больше) Фалы содержат текстовую информацию, которую нужно распарсить и почистить. как бы мне это сделать наиболее оптимальным образом? |
|||
|
||||
| aleksandy |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 260 Регистрация: 17.12.2006 Репутация: 4 Всего: 5 |
Задачу можно уточнить? Что за текстовая информация? В каком виде она хранится, что нужно с ней сделать конкретно?
Покажи как ты начал это все реализовывать, если начал. Тогда может быть тебе кто-нибудь и поможет. |
|||
|
||||
| CSharpProgrammer |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 44 Регистрация: 6.7.2006 Репутация: нет Всего: нет |
Задача #1: Имеется файл большого размера (загрузить весь в память нет возможности) содержащий предложения разделенные точкой. Нужно удалить дубли. Алгоритм: Есть исходный файл (содержащий предложения с дублями) и результирующий (файл куда будут записываться уникальные предложения). После того как кол-во предложений в результирующем файле привысит размер блока, то каждое предложение следующего блока с исходного файла будет сравниваться с каждым предложением всех блоков результирующего (+оптимизация). Т.е. нужно считывать блоки предложений с обоих файлов и сравнивать тоже блоками. Задача #2: Имеется большое кол-во файлов (больше 5.000.000) размером оклол 1 мб, файлы находятся не в одной директории, а в суб-директориях, вложенность директорий тоже довольно большая (К примеру в Директории А содержаться 10 файлов и 5 поддиректорий. Каждая поддиректория в свою очередь тоже содержит файлы и другие суб-директории и.т.д.). Так вот нужно обойти все суб-директории и обработать все файлы. Файлы нужно почистить от всех символов не являющихся буквами при этом сохранить структуру предложений. |
|||
|
||||
| AntonSaburov |
|
|||
![]() Штурман ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 5658 Регистрация: 2.7.2002 Где: Санкт-Петербург Репутация: 51 Всего: 118 |
По поводу 1
Я не понял по поводу "После того как кол-во предложений в результирующем файле привысит размер блока, то каждое предложение следующего блока с исходного файла будет сравниваться с каждым предложением всех блоков результирующего". Что за блок такой ? По поводу 2 Ну тут рекурсивно обегать надо. Что-то вроде такого
|
|||
|
||||
| soulcub |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 130 Регистрация: 2.2.2010 Где: Винница, Украина Репутация: нет Всего: 2 |
По задаче №1. Я бы считывал из 1-го файла по предложению и сверял бы его со всеми предложениями результирующего файла по мере его наполнения.. Так в конце сложность вычислений будет равна n!, где n-количество уникальных строк, что не так и страшно.. Правда всё это будет с файлами.. Можно перекачать весь исходник в бинарный файл, для ускорения чтения с файла. Я так себе думаю, что делать блоками - нет смысла, ибо что на прямую, что блоками, всё равно количество чтений из файла будет большими.
Ну это я так думаю. Может ошибаюсь) По 2-й. Не знаю, хватит ли памяти) Но можно попробовать рекурсивно обойти все каталоги с очисткой файлов на каждом уровне.. Если памяти не хватает, то можно разделить рекурсию, например отдельно на все подкаталоги главного каталога. Это уменьшит затраты в [количество подкаталогов] раз. --------------------
Так давай же, поспеши!Отыскать СВОЙ куб души! |
|||
|
||||
| jk1 |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 1168 Регистрация: 17.10.2008 Где: Санкт-Петербург Репутация: 40 Всего: 75 |
По задаче про один большой файл для оптимизации сравнения строк предлагаю считать их Хэш-коды.
За первый проход файла считаем хэш-коды всех строк. Далее группируем полученные хэш-коды по совпадению с указанием номеров строк. Затем делаем второй проход файла и сравниваем только группы строк с совпадающих хэш-кодом. Сравниваем потому, что надо принять во внимание и коллизии хэш-функции тоже. Во время второго прохода параллельно пишем результирующий файл. Для того, чтобы не вычитывать в память файл целиком можно иcпользовать Memory Mapped Files -------------------- Opinions are like assholes — everybody has one |
|||
|
||||
| Connie |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 382 Регистрация: 12.8.2008 Репутация: 1 Всего: 9 |
А не проще вначале закинуть эти предложения в какую либо БД, а потом просто одим запросом дропнуть дубли и перезаписать этот файл? |
|||
|
||||
| CSharpProgrammer |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 44 Регистрация: 6.7.2006 Репутация: нет Всего: нет |
AntonSaburov
Спасибо. Под блоками имелось ввиду - чтобы не считывать одно предложение с исходного файла и сравнивать с каждым из результирующего, считывать блок предложений (скажем 100) и потом уже в памяти сравнивать эти 100 предложений с предложениями из результирующего. Т.е. Когда в результирующем файле будет больше 100 предложений, то будем делать так: 1) Считаем 100 предложений из исходного 2) Считаем 100 из результирующего 3) Сравним их и найдем уникальные (к примеру 20) 4) Считаем следующий блок из результирующего 5) Сравним оставшиеся (20 уникальных) с предложениями из этого блока 6) ну и т.д. В общем считывать не по одному предложению а блоками. soulcub Спасибо. Про рекурсию мне тоже кажется может не хватить памяти, но раз другого способа нет, то будем разбивать на подходы (по директориям). jk1 Спасибо за Хэш-коды и Memory Mapped Files Connie Возможно и проще, спасибо. |
|||
|
||||
| Connie |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 382 Регистрация: 12.8.2008 Репутация: 1 Всего: 9 |
|
|||
|
||||
![]()
|
| Правила форума "Java" | |
|
|
Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Java: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |