Lab 1. Fixed - #43
Conversation
Lab 1. First commit
| throw new FileNotFoundException(); | ||
|
|
||
| int hash = FNV_OFFSET_BASIS; | ||
| byte[] bytes = Files.readAllBytes(filePath); |
There was a problem hiding this comment.
а какие технические характеристики должны быть у компьютера, чтобы посчитать хеш файла размером 40Гб, например?
|
|
||
| try { | ||
| String inputFilePath = args.length > 0 ? args[0] : ""; | ||
| String outputFilePath = args.length > 1 ? args[1] : ""; |
There was a problem hiding this comment.
При выполнении задания следует обратить внимание на:
Дизайн и обработку исключений, диагностику ошибок.
а как пользователь программы поймёт что нужно передавать на вход?
| } | ||
|
|
||
| reader.close(); | ||
| outputFileWriter.close(); |
| System.out.println("ERROR:"); | ||
| System.out.println("\tMethod name: " + ex.getStackTrace()[0].getMethodName()); | ||
| System.out.println("\tException type: " + ex.getClass().getName()); | ||
| System.out.println("\tMessage: " + ex.getMessage()); |
There was a problem hiding this comment.
это действительно полезная информация? куда уж лучше тогда просто stack trace выводить
| protected static String calculateHash(Path filePath) { | ||
| try { | ||
| if (!Files.exists(filePath)) | ||
| throw new FileNotFoundException(); |
There was a problem hiding this comment.
а зачем так сложно? целое throw ради return INCORRECT_FILE_HASH;
|
Первая версия лабораторной работы содержала недочеты, которые были исправлены. Также была добавлена реализация усложненной части. В процессе модернизации было решено подвергнуть изменениям структуру проекта первой лабораторной работы, а именно: были добавлены новые классы: FileManager, HashManager, которые реализуют методы и поля, предназначенные для обработки файла и вычисления хеша соответственно. С пониманием того, что представленная реализация может быть неоптимальной/некорректной я готова внести правки в соответствии с дальнейшими комментариями. |
|
Ниже приведены результаты выполнения программы на файлах разных размеров: File size (bytes): 23306526 Hash: 811c9dc5 Elapsed time: 1.30770967 seconds |
| try { | ||
| File file = new File(path); | ||
|
|
||
| if (file.isDirectory()) |
There was a problem hiding this comment.
дублирование с processDirectoryPath
вообще в Java уже есть способ обхода файловой системы https://docs.oracle.com/javase/tutorial/essential/io/walk.html
|
|
||
| byte[] fileChunk = new byte[fileManager.chunkSize]; | ||
| fileManager.inputStream.read(fileChunk, 0, fileChunk.length); | ||
| fileManager.available -= fileChunk.length; |
There was a problem hiding this comment.
inputStream.read возвращает количество прочитанных байт в буфер или -1 если поток закончился
https://docs.oracle.com/javase/8/docs/api/java/io/InputStream.html#read-byte:A-
поддерживать available избыточно, а каждый раз выделять память под буфер на каждый чанк совсем уж печально.
| long freeMemory = Runtime.getRuntime().freeMemory(); | ||
|
|
||
| if (chunkSize > freeMemory) { | ||
| chunkSize = (long) Math.round(freeMemory / 4); |
There was a problem hiding this comment.
неясно что ты хотела этим добиться, кроме желания забрать четверть свободной памяти у всех остальных программ в операционной системе :)
читать по одному байту (из прошлой версии) неэффективно из-за слишком частого частого обращения в файловой системе, которое не бесплатное
читать огромными кусками, да ещё и на каждый кусок выделять новый кусок памяти также неээфективно, так как файловая система «за раз» много не отдаст.
оптимальное использовать размер блока файловой системы. он разнится, но средние значения около 4 / 8 КБ
There was a problem hiding this comment.
и даже не четверть памяти, а больше.
на чтения каждого чанка у тебя выделяется новый буффер равный четверти свободной памяти, и, если файл больше чем свободная память, то программа может попытаться забрать себе всю доступную память
один час для такого файла это очень долго. |
Lab 1. First commit