Skip to content

Lab 1. Fixed - #43

Open
HelenDevelopment wants to merge 2 commits into
techno-aads:makarchukfrom
HelenDevelopment:makarchuk
Open

Lab 1. Fixed#43
HelenDevelopment wants to merge 2 commits into
techno-aads:makarchukfrom
HelenDevelopment:makarchuk

Conversation

@HelenDevelopment

Copy link
Copy Markdown

Lab 1. First commit

Lab 1. First commit
throw new FileNotFoundException();

int hash = FNV_OFFSET_BASIS;
byte[] bytes = Files.readAllBytes(filePath);

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

а какие технические характеристики должны быть у компьютера, чтобы посчитать хеш файла размером 40Гб, например?


try {
String inputFilePath = args.length > 0 ? args[0] : "";
String outputFilePath = args.length > 1 ? args[1] : "";

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

При выполнении задания следует обратить внимание на:
Дизайн и обработку исключений, диагностику ошибок.

а как пользователь программы поймёт что нужно передавать на вход?

}

reader.close();
outputFileWriter.close();

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

try-with-resources

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());

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

это действительно полезная информация? куда уж лучше тогда просто stack trace выводить

protected static String calculateHash(Path filePath) {
try {
if (!Files.exists(filePath))
throw new FileNotFoundException();

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

а зачем так сложно? целое throw ради return INCORRECT_FILE_HASH;

@HelenDevelopment HelenDevelopment changed the title Lab 1. First commit Lab 1. Fixed Apr 12, 2018
@HelenDevelopment

Copy link
Copy Markdown
Author

Первая версия лабораторной работы содержала недочеты, которые были исправлены. Также была добавлена реализация усложненной части. В процессе модернизации было решено подвергнуть изменениям структуру проекта первой лабораторной работы, а именно: были добавлены новые классы: FileManager, HashManager, которые реализуют методы и поля, предназначенные для обработки файла и вычисления хеша соответственно. С пониманием того, что представленная реализация может быть неоптимальной/некорректной я готова внести правки в соответствии с дальнейшими комментариями.

@HelenDevelopment

Copy link
Copy Markdown
Author

Ниже приведены результаты выполнения программы на файлах разных размеров:

File size (bytes): 23306526 Hash: 811c9dc5 Elapsed time: 1.30770967 seconds
File size (bytes): 5493239665 Hash: 64744d125cef48b1 Elapsed time: 135.335151703 seconds
File size (bytes): 42083391592 Hash: 97ee87d531831b3e Elapsed time: 861.930752081 seconds
File size (bytes): 81979887523 Hash: 86ff7b4306241351 Elapsed time: 3646.795348933 seconds

try {
File file = new File(path);

if (file.isDirectory())

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

дублирование с 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;

@techno-aads techno-aads Apr 21, 2018

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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);

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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

читать по одному байту (из прошлой версии) неэффективно из-за слишком частого частого обращения в файловой системе, которое не бесплатное
читать огромными кусками, да ещё и на каждый кусок выделять новый кусок памяти также неээфективно, так как файловая система «за раз» много не отдаст.

оптимальное использовать размер блока файловой системы. он разнится, но средние значения около 4 / 8 КБ

https://stackoverflow.com/questions/236861/how-do-you-determine-the-ideal-buffer-size-when-using-fileinputstream/

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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

@techno-aads

Copy link
Copy Markdown
Owner

File size (bytes): 81979887523 Hash: 86ff7b4306241351 Elapsed time: 3646.795348933 seconds

один час для такого файла это очень долго.
время должно быть хоть как-то сопоставимо с https://ru.wikipedia.org/wiki/Md5sum

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants