Есть некоторые улучшения:
Во-первых, пожалуйста, не используйте конструктор new Scanner(File)
, так как он использует небуферизованный ввод / вывод. Операции чтения небольших дисков, особенно на жестких дисках, очень неэффективны. Вместо этого используйте, например, BufferedInputStream с буфером 65 КБ:
try (Scanner s = new Scanner(new BufferedInputStream(new FileInputStream(f), 65536))) {
// your code
}
Секунда: Скорее всего, ваш ПК имеет многокодовый процессор. Поэтому вы можете сканировать несколько файлов параллельно. Для этого вы должны убедиться, что вы используете многопоточную map
. Измените определение карты на:
Map<String,String> map = new ConcurrentHashMap<>();
Затем вы можете использовать следующий код:
Files.list(dir.toPath()).parallel().forEach(f -> {
try (Scanner s = new Scanner(new BufferedInputStream(Files.newInputStream(f), 65536))) {
// your code
} catch (IOException e) {
e.printStackTrace();
}
});
В зависимости от ядер ЦП в вашей системе он будет обрабатывать несколько файлов одновременновремя. Особенно, если вы обрабатываете большое количество файлов, это значительно сократит время выполнения вашей программы.
Наконец ваша реализация довольно сложна. Вы используете вывод Scanner для создания новой строки, которая затем снова разделяется. Вместо этого было бы лучше настроить Scanner так, чтобы он непосредственно рассматривал нужный разделитель:
try (Scanner s = new Scanner(....).useDelimiter("[ ,\\!\\-\\.\\?\\*]")) {
Тогда вы можете напрямую использовать токены, созданные Scanner, и вам не нужно создавать строку article
String и более позднюю разбивку. Это.