2013-04-08 2 views
1

У меня был быстрый вопрос. Я работаю над школьным проектом, и мне нужно разобрать чрезвычайно большой текстовый файл. Это для класса базы данных, поэтому мне нужно получить уникальные имена актеров из файла, потому что актеры будут первичным ключом в базе данных mysql. Я уже написал парсер, и он отлично работает, но в то время я забыл удалить дубликаты. Итак, я решил, что самым простым способом было бы создание акролога. (Используя ArrayList ADT) Затем используйте метод contains(), чтобы проверить, находится ли имя актера в arraylist, прежде чем я его распечатаю в новый текстовый файл. Если это я ничего не делаю, если нет, я добавляю его в arraylist и печатаю на страницу. Теперь программа работает очень медленно. Перед арраистом это заняло около 5 минут. Старый файл актера был 180k без дубликатов удалены. Теперь он работает 30 минут и до 12k. (На этот раз я ожидаю 100k-150k).Java- Разбор большого текстового файла

Я оставил размер архиватора пустым, потому что я не знаю, сколько актеров в файле, но не менее 1-2 миллионов. Я думал о том, чтобы просто положить 5 миллионов за свой размер и проверить, не получилось ли после этого. (Просто проверьте последний индекс arraylist, и если он пуст, это не закончилось.) Это уменьшит время, потому что arraylist не будет постоянно увеличиваться и переписывать все? Есть ли другой способ, который будет быстрее этого? Я также обеспокоен тем, что у моего компьютера может закончиться память, прежде чем он завершится. Будем признательны любому совету.

(Также я попытался запустить уникальную команду в текстовом файле без успеха. Имена действующих лиц распечатывают 1 на строку. (В одном столбце) Я думал, что, возможно, команда была неправильной. Как бы вы удалили дубликаты из столбец текстового файла в командной строке windows или linux?) Спасибо и извините за длинный пост. Завтра у меня средний срок, и я начинаю напрягаться.

+2

Используйте набор вместо списка. Содержания Set намного эффективнее и удаляют дубликаты. В эти дни вам нужно много GB, чтобы быть действительно большим. Я бы назвал туберкулез чрезвычайно большим, хотя даже это становится все более распространенным явлением. Если вы обеспокоены тем, что 5 миллионов слишком много, я предлагаю вам рассчитать, сколько памяти используется миллион, и оценить, сколько памяти вам понадобится. –

+0

вы можете делать только «уникальные» элементы после сортировки, и если размер вашего файла меньше, чем у вас, вы должны сделать это через несколько минут (или секунды в зависимости от объема работы, которую вы делаете с этими данными) –

+0

I У меня все еще есть повторяющаяся проблема, которая не имеет смысла. Так что программа настроена, чтобы сделать, это прочитать имя procuders, затем я использую manufacturer.add (productcername), чтобы добавить имя в HashSet. В самом конце программы перед ее завершением я использую итератор для печати набора в текстовый файл по одному за раз. Затем я пошел и попробовал загрузить его в базу данных, и он все еще говорит, что содержит повторяющиеся записи. Это должно быть невозможно. Размер файла с дубликатами составлял 50 тыс., После использования HashSet и печати в текстовый файл до 7k. Кажется, он работает. – Dan

ответ

2

Стоимость поиска с использованием arrayList содержит(), дает вам примерно O (n) производительность. Выполнение этого миллиона раз - это то, что я думаю, убивая вашу программу.

Используйте реализацию HashSet Set. Он предоставит вам теоретически постоянный поиск по времени и автоматически удалит дубликаты для вас.

+0

Спасибо, я принял все советы. Все было в основном одинаково.Кажется, теперь он работает намного быстрее. Размер файла вырос примерно до 12k за 3 минуты. Это заняло около 45 минут с архаистом. Его все еще займет час, но все в порядке. Текстовый файл составляет около 1 Гб. Он содержит фильмы 800k +. В каждом фильме есть ключевые слова, актеры, режиссеры, год, время, рейтинг и т. Д. Я превращаю этот большой файл примерно в 8 меньших. Я закончил их все время назад, кроме директоров, актеров и продюсеров, которые содержат дубликаты. Набор работает отлично, спасибо! – Dan

4

Используйте Set вместо List, поэтому вам не нужно проверять, содержит ли коллекция элемент. Набор не позволяет дублировать.

1

-Постарайтесь с использованием памяти отображенной файл в Java для более быстрого доступа к большому файлу

й вместо ArrayList использовать HashMap коллекцию в где ключ имя актера (или хэш-код), это будет значительно улучшать скорость, так как поиск ключа в HashMap очень быстр.