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
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.