обрабатывать большой файл с помощью многопоточности

На диске есть довольно большой файл (>10G ), каждая строка внутри файла состоит из номера строки -и имени человека, вот так:

1 Jane
2 Perk
3 Sime
4 Perk
....

Я должен прочитать этот большой файл и найти частоту каждого имени, наконец, вывести результаты в порядке убывания частоты каждого имени, вот так:

Perk 2
Jane 1
Sime 1

Как просил интервьюер, указанная выше работа должна быть выполнена максимально эффективно, и разрешена многопоточность. И мое решение примерно такое:

  1. Поскольку файл слишком велик, я разбиваю его на несколько небольших файлов, размер каждого маленького файла составляет примерно 100M, с помощью lseekя могу найти начало и конец каждого маленького файла (beg, end);

  2. Для этих небольших файлов существует общая карта хэшей -, использующая имя человека в качестве ключа и сколько раз оно отображается в качестве значения;

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

  4. Когда все потоки закончатся, думаю, пора отсортировать карту хэшей -по полю value.

Но поскольку в этом файле может быть слишком много имен, сортировка будет медленной. Я не придумал, как выводить имена в порядке убывания.

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

6
задан Benjamin 3 February 2014 в 14:04
поделиться