Запись в конце файла

Я работаю над системой, которая требует высокого выполнения файлового ввода-вывода (с C#). В основном я заполняю большие файлы (~100MB) от запуска файла до конца файла. Каждые ~5 секунд я добавляю ~5MB к файлу (последовательно от запуска файла), на каждом объеме я сбрасываю поток. Каждые несколько минут я должен обновить структуру, которую я пишу в конце файла (некоторые метаданные).

При сбрасывании каждого из объемов у меня нет проблемы производительности. Однако при обновлении метаданных в конце файла я получаю действительно низкую эффективность. Мое предположение - то, что при создании файла (который также должен быть сделан дополнительный быстрый), файл не делает, действительно выделяет все 100 МБ на диске и когда я сбрасываю метаданные, это должно выделять все место до конца файла.

Парни/Девочки, какая-либо Идея, как я могу преодолеть эту проблему?

Большое спасибо!

Из комментария:

В общем разговоре кода следующим образом, сначала файл открыт:

m_Stream = new FileStream(filename, 
         FileMode.CreateNew, 
         FileAccess.Write, 
         FileShare.Write, 8192, false); 
m_Stream.SetLength(100*1024*1024);

Каждые несколько секунд я пишу ~5MB.

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).
6
задан Henk Holterman 16 May 2010 в 20:25
поделиться

4 ответа

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

Это сделает две вещи (предполагая не разреженный файл)... 1. выделит общее пространство для всего файла 2. сделает все последующие операции записи немного быстрее, поскольку пространство готово и ждет.

Нельзя ли сделать это асинхронно? По крайней мере, приложение может потом перейти к другим вещам.

2
ответ дан 17 December 2019 в 18:11
поделиться

Ваш вопрос не совсем ясен, но я предполагаю, что вы создаете файл, записываете 5 МБ, затем ищете 100 МБ и записываете метаданные, затем ищете обратно к 5 МБ и записываете еще 5 МБ и так далее.

Если это так, то это проблема файловой системы. Когда вы расширяете файл, NTFS должен заполнить пробел чем-то. Как вы говорите, файл не выделяется, пока вы не напишете в него. При первой записи метаданных размер файла составляет всего 5 МБ, поэтому при записи метаданных NTFS должна выделить и записать 95 МБ нулей, прежде чем записывать метаданные. К сожалению, я думаю, что он также делает это синхронно, поэтому вы даже не выигрываете, используя перекрывающиеся операции ввода-вывода.

0
ответ дан 17 December 2019 в 18:11
поделиться

Как насчет использования BufferedStream?

http://msdn.microsoft.com/en-us/library/system.io.bufferedstream (v = VS.100) .aspx

0
ответ дан 17 December 2019 в 18:11
поделиться

Пробовали ли вы метод AppendAllText?

1
ответ дан 17 December 2019 в 18:11
поделиться
Другие вопросы по тегам:

Похожие вопросы: