Я работаю в системе, которая требует высокой производительности файлового ввода-вывода (с C #).
По сути, я заполняю большие файлы (~ 100 МБ) от начала файла до конца файла.
Каждые ~ 5 секунд я добавляю ~ 5 МБ к файлу (последовательно от начала файла), при каждой массе я очищаю поток.
Каждые несколько минут мне нужно обновлять структуру, которую я пишу в конце файла (какие-то метаданные).
При промывке каждого из них у меня нет проблем с производительностью.
Однако при обновлении метаданных в конце файла я получаю очень низкую производительность.
Я предполагаю, что при создании файла (что также должно быть сделано очень быстро), файл на самом деле не выделяет все 100 МБ на диске, и когда я сбрасываю метаданные, он должен распределять все пространство до конца файла.
Ребята / Девочки, есть идеи, как мне преодолеть эту проблему?
Большое спасибо!
Из комментария:
Вообще говоря, код выглядит следующим образом: сначала файл открывается:
m_Stream = new FileStream(filename,
FileMode.CreateNew,
FileAccess.Write,
FileShare.Write, 8192, false);
m_Stream.SetLength(100*1024*1024);
Каждые несколько секунд я пишу ~ 5 МБ.
m_Stream.Seek(m_LastPosition, SeekOrigin.Begin);
m_Stream.Write(buffer, 0, buffer.Length);
m_Stream.Flush();
m_LastPosition += buffer.Length; // HH: guessed the +=
m_Stream.Seek(m_MetaDataSize, SeekOrigin.End);
m_Stream.Write(metadata, 0, metadata.Length);
m_Stream.Flush(); // Takes too long on the first time(~1 sec).