На диске есть довольно большой файл (>10G ), каждая строка внутри файла состоит из номера строки -и имени человека, вот так:
1 Jane
2 Perk
3 Sime
4 Perk
....
Я должен прочитать этот большой файл и найти частоту каждого имени, наконец, вывести результаты в порядке убывания частоты каждого имени, вот так:
Perk 2
Jane 1
Sime 1
Как просил интервьюер, указанная выше работа должна быть выполнена максимально эффективно, и разрешена многопоточность. И мое решение примерно такое:
Поскольку файл слишком велик, я разбиваю его на несколько небольших файлов, размер каждого маленького файла составляет примерно 100M
, с помощью lseek
я могу найти начало и конец каждого маленького файла (beg, end)
;
Для этих небольших файлов существует общая карта хэшей -, использующая имя человека в качестве ключа и сколько раз оно отображается в качестве значения;
Для каждого небольшого файла через него проходит один поток, каждый раз, когда поток встречает имя человека, он будет увеличивать соответствующее значение value
в карте общего хэша -;
Когда все потоки закончатся, думаю, пора отсортировать карту хэшей -по полю value
.
Но поскольку в этом файле может быть слишком много имен, сортировка будет медленной. Я не придумал, как выводить имена в порядке убывания.
Надеюсь, кто-нибудь может помочь мне с вышеуказанной проблемой, дать мне лучшее решение о том, как выполнять работу с помощью многопоточности и сортировки.