SdFat: Почему первая запись в файл занимает так много времени?
Я проверил эту проблему на 6 картах micro-SDHC 3 разных типов. 3 — Sandisk на 32 ГБ, 2 — Kingston на 16 ГБ и 1 — Samsung на 16 ГБ. Эти карты используются в регистраторах данных и обычно содержат сотни или тысячи текстовых файлов размером 5 МБ с именами в формате FILE1234.TXT.
Проблема в том, что при запуске логгера с такой картой (содержащей данные) первая запись занимает много времени - от 7 до 30 секунд. Открытие файла (наименьшее доступное имя файла) не займет слишком много времени. Последующие записи не занимают много времени. Только первая запись.
Теперь сюжет сгущается: эту задержку можно устранить, сначала открыв FILE0000.TXT и сразу же закрыв его. Кроме того, как только это будет сделано, эта задержка больше никогда не повлияет на этот диск. Это произошло с каждым из дисков.
Вот небольшой код, демонстрирующий проблему:
#include <SdFat.h>
SdFat sd;
SdFile file;
void setup(){
Serial.begin(57600);
sd.begin();
int m = millis(); // просто рассчитать время
// критическая строка, предотвращающая задержки
file.open("FILE0000.TXT", O_WRITE | O_TRUNC | O_CREAT); file.close();
// файл, в который мы действительно хотим записать
file.open("FILE6005.TXT", O_WRITE | O_TRUNC | O_CREAT);
Serial.println(millis()-m); // вывести, сколько времени потребовалось для открытия
file.println(F("test"));
Serial.println(millis()-m); // вывести, сколько времени потребовалось для записи
file.close();
}
void loop(){
}
Когда "критическая строка" в коде закомментирована, я получаю большую задержку при первой записи в файл. Когда он раскомментирован, задержки нет, и я никогда больше не получаю задержку на этом диске, даже если строка закомментирована. Я видел это на всех шести дисках.
Еще одна загадка: поначалу это не работало на одной из карт. Я проверил и обнаружил, что только на этой карте был скрытый каталог «.Trash-1000». Я удалил этот каталог и повторил попытку, и в этот раз это исправление сработало.
Кто-нибудь знает , что здесь происходит?
@Vulcan, 👍2
Обсуждение2 ответа
Лучший ответ:
Большинство файловых систем демонстрируют низкую производительность при хранении большого количества файлов в одном каталоге. «Обычные» настольные компьютеры, возможно, настолько быстры, что вы не заметите влияния на производительность, но при доступе к файловой системе с относительно медленного микроконтроллера, который также имеет ограниченные средства кэширования структур данных файловой системы в ОЗУ, вы можете следует учитывать это и либо записать меньшее количество файлов, либо построить дерево каталогов, чтобы у вас было только ограниченное количество файлов в каждом каталоге.
Зачем менять структуру файла, если, как сказано в вопросе, задержку можно устранить всего одной строчкой кода?, @Chupo_cro
Я тоже это наблюдал, но с программированием на «голом железе», а не с Arduino. Я использую чип STM32F7 для записи на SD-карту класса 10, используя блочную запись стандарта SD-карты. Я использую пользовательскую файловую систему, а не FAT. Моя первая запись на SD-карту занимает примерно в 8-10 раз больше времени, чем все остальные записи. Это каждый раз, когда я отключаю питание и снова подаю питание на устройство. Этого не происходит, если я перезагружаю процессор, не отключая блок питания. Если я только перезагружаю процессор (что означает перенастройку и инициализацию SD-карты), этой задержки записи не происходит.
Единственное, что не происходит с SD-картой до первой записи, — это конфигурация конечного автомата пути данных (DPSM). Может ли быть причиной того, что DPSM находится в состоянии, которое не способствует записи при запуске?
- Как увеличить скорость записи на SD-карту в Ардуино
- SD-карта не инициализируется
- Что означают эти контакты? Куда мне их подключить?
- Режимы открытия файлов на SD-карте Arduino добавление/перезапись
- Какие контакты можно использовать для выбора микросхемы (CS, CC) на Arduino Nano Every?
- Понимание того, почему следует избегать «String» и альтернативных решений
- Сделать CS (chip select) для работаты в SPI (для и SD карты и OLED)
- Можно ли подключить экран SD-карты к плате Digispark ATtiny85?
Это действительно интересно, мне тоже хотелось бы знать, что именно происходит., @Chupo_cro
Похоже, что библиотека SD-FAT загружает структуру каталогов, таблицы размещения файлов, создавая «представление» использования/расположения SD-карт. Испытываете ли вы задержку при открытии FILE0000.TXT? Подкаталог .Trash-1000, вероятно, вызвал полное сканирование структуры каталога, поскольку SD-FAT искал FILExxxx.TXT. Помните, что вы используете устройство с ограниченным объемом памяти, и библиотека SD-FAT должна поддерживать минимальное использование памяти, поэтому блоки/сектора многократно считываются и сбрасываются, а не кэшируются, как это делается в (гораздо) более крупных системах памяти. Это значительно замедлит доступ., @lornix
Вероятно, вы получите огромное увеличение скорости, если разделите файлы на каталоги, например
3/6/FILE3672.TXT
, @Majenko