Някой тества ли наистина домашното за "колекции и библиотеки" със 100 МВ файл?
Някой има ли да е тествал първата задача от домашното за броене на думи, наистина със 100 МВ файл. Аз успях да намеря "Atlas Shrugged", която в текстов формат е около 3 МВ. Програмата ми ги превърта за около 4 секунди, като за да видя какво прави, ги изкарах не само на конзола, но и в текстов файл (резултатът). Т.е. това е време и за конзола, и за писане във файл. Самия текстов файл излезе 319 КВ :)
При тази скорост, ако от някъде се намери файл 100 МВ, би трябвало да превърти за около 120 секунди :)
Някой има ли подобен тест :)
Аз използвах сайта LoremIpsum да генерира малък текст (пробвах да ми генерира 100МБ, но явно имат ограничение...) и го копирах многократно. 100Mb ми ги прочита за 15 секунди заедно с обработката (split и вкарване в речник). Търсенето после става супер бързо, все пак е речник.
При мен този вашия файл го извърта за 12 секунди. Установих обаче друго нещо интересно. Изходният файл този път е само 22 КВ. Т.е. 15 пъти по-малко. Т.е. езикът на Наков е 15 пъти по-беден откъм думи и изрази, от езика на Айн Ранд :)
И аз го бях направил с HashMap само, че в HashMap бях сложил думите, които търся, като идеята ми беше да не броя весички думи а само търсените. А текста от файла беше в лист. После установих, че така на практика обхождам 2 пъти целия текст (един път да го въвежда в листа и втори път за да намеря търсените думи) и обърнах при чете да записва в HashMap-а а търсените думи в лист. Сега файла 120 МБ го обработва за около 4 секунди +/- а самото търсене е излишно да го коментирам.
Така мисля, че и памет пести понеже не запомня дадена дума "педесет хиляди пъти" в даден лист ами ако открие съвпадение само променя стойността в речника.
Аз директно си чета от файла ред по ред, пъхам 10-на думи във временен масив и после - масива foreach в речника направо... Ако я има думата, само вдига value, ако я няма, я добавя с value 1.