FAT, оптимизировать производительность при получении файла

У меня есть реализация базы данных с одним файлом на запись, и у меня есть около 10000 записей. Я пытаюсь оптимизировать производительность доступа к файлу, и у меня есть небольшие сомнения.

Лучше разделить файлы на папки, чем хранить все в одной папке для быстрого доступа к файлам? например: от 0 до 999 в папке 0, от 1000 до 1999 в 2 и т. д.

Что лучше для этого, FAT16 или FAT32?

3 ответа

Решение

Если вы обращаетесь к файлам напрямую, производительность не снизится. Если вы ищете определенный файл на диске, было бы быстрее хранить их в папках. Таким образом, папки будут эмулировать индексы БД. Но, как упоминалось @blow, почему бы вам не использовать что-то вроде Sqlite?

Разделите их по каталогам (число разделений зависит от размера вашего кластера) и не используйте LFN (LongFileName), если это возможно, потому что это замедлит вашу работу. Я также работаю над встроенными системами. Мне не нужно было получать доступ к тысячам файлов, как вы, но я избегал LFN (особенно по соображениям роялти).

Когда ты retrieve a file by filename Скорее всего, вы выполняете линейный поиск в каталоге, содержащем этот файл, вы пропускаете все записи каталога, пока не найдете тот, который соответствует данному имени файла.

Эта операция поиска может быть медленной, если вы делаете это каждый раз для каждого файла, в каталоге много файлов, и чтение выполняется медленно (если ваш процессор медленный, вы теряете даже больше).

Вы можете создать какой-то индекс, компактный массив пар filename+location отсортировано по имени файла, которое вы можете сохранить в памяти для быстрого поиска файлов без перечитывания записей каталога.

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

Единственное практическое различие между FAT1x и FAT32 в этом контексте - это размер таблицы размещения файлов, этого набора связанных списков / цепочек, который сообщает вам, какие кластеры свободны или заняты данными файла / каталога, и сообщает, какой кластер является следующим в файл / каталог после указанного. В FAT32 элементы цепочки кластеров 32-битные, в 2 раза больше, чем в FAT16. Если количество используемых кластеров невелико (менее ~64 КБ), вы будете читать в два раза больше данных из FAT32 при обходе цепочек кластеров по сравнению с FAT16. Кроме того, поиск свободного кластера на FAT32 (когда вы создаете новый файл /dir или увеличиваете существующий) может быть медленным, если на диске много кластеров (и их может быть до 2^28 на FAT32 AFAIR против 2^16 из FAT16). Вы не хотите каждый раз начинать поиск свободного кластера с начала FAT. Вы хотите где-нибудь сохранить указатель на последнее место, где вы остановили поиск, и в следующий раз искать оттуда, а затем перейти к началу FAT, когда вы достигнете конца FAT.

Другие вопросы по тегам