FAT, оптимизировать производительность при получении файла - PullRequest
1 голос
/ 18 марта 2012

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

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

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

Ответы [ 3 ]

2 голосов
/ 18 марта 2012

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

0 голосов
/ 18 марта 2012

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

0 голосов
/ 18 марта 2012

Когда вы 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.

...