LINUX.ORG.RU

Подскажите чайнику как быстро читать с диска


0

1

Всем доброго времени суток! Возможно все уже тыщу раз обсуждалось, тогда просто дайте ссылки где почитать. Задача вот такая: написать программу максимально быстрого чтения с любого места (файловой системы нет) жесткого диска. Запись не нужна. Данные записываются на диск заранее. Я пописывал на С++ под Windows, а тут стушевался. Стандартное чтение из файлов не проблема. Как бы читать прямо с диска? Спасибо заранее.

под виндой? через дескриптор устройства

а под линуксом dd if=/dev/sda bs=2M итд

AGUtilities ★★★ ()

Обычные open(), read(), быстрее ничего не будет. Только главное не читать по одному байту за раз.

mashina ★★★★★ ()
Ответ на: комментарий от anonymous

имеется в виду утилита копирования? Но мне нужен код для постоянного использования в подпрограмме, которая и будет читать с произвольной позиции диска и как можно быстро. Опять извиняюсь за невежество, означает ли Ваш знак вопроса, что я могу найти исходный код утилиты и использовать его? Спасибо

vpostems ()
Ответ на: комментарий от vpostems

man lseek, man read.

Только если у вас система 32-разрядная, почитайте про макросы, которые надо определить до включения sys/types.h и unistd.h, чтобы смещение было 64-битным.

Eddy_Em ☆☆☆☆☆ ()
Ответ на: комментарий от Eddy_Em

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

Eddy_Em ☆☆☆☆☆ ()
Ответ на: комментарий от Eddy_Em

Спасибо опять! Теперь извините, попытаю Вас: если использовать функции lseek и read, то значит я должен открывать устройство функцией open? Если так, то как правильно указать путь и какие флаги, а то например без подготовки open(«/dev/sda1»,O_RDONLY) вызывает ошибку доступа.

vpostems ()
Ответ на: комментарий от vpostems

Вы - спаситель!!! open отработала! Буду пробовать читать. Огромное спасибо.

vpostems ()

Все диски представлены в линуксе в виде файлов блочных устройств. Можно читать напрямую оттуда.

trex6 ★★★★★ ()

сделай mmap на блочное устройство, а потом делай memcpy куда тебе нужно

Reset ★★★★★ ()

man pread ну и не забываем про O_LARGEFILE

Если нужно копец как быстро, то, возможно, тебе подойдет O_DIRECT (правда читать произвольные по смещению и размерам куски не получится)

Еще четай про fadvise

ещё один вариант - mmap + madvise

ещё один вариант - splice

В любом варианте - читать наиболее оптимально блоками по 4096 байт по смещению кратному 4096 байтам. при ммапе - оно само сабой так делает.

mmarkk ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.