Записать много файлов на диск c#
Мне нужно записать на диск много (> 5000000) файлов (размер < 200 байт). Использую File.WriteAllText, но работает долго (более двух часов, дальше не вытерпел) и кушает много оперативки (хотя, как мне казалось, не должно). Структура файловой системы реализована в виде префиксного дерева.
public void AddTempPassport(TempPassport newPassport)
{
var splitedSeries = new string[] { string.Join("", newPassport.Series.Take(2)), string.Join("", newPassport.Series.Skip(2)) };
var splitedNumber = new string[] { string.Join("", newPassport.Number.Take(3)), string.Join("", newPassport.Number.Skip(3)) };
string path = Path.Combine(_rootPath, _tempPassportsPath, splitedSeries[0], splitedSeries[1], splitedNumber[0], splitedNumber[1]);
if (!_fileHandler.DirectoryExists(path))
{
_fileHandler.CreateDirectory(path);
}
_fileHandler.WriteAllText(Path.Combine(path, $"{newPassport.Series},{newPassport.Number}.json"), JsonSerializer.Serialize(newPassport));
}
Приложение берет строчку из файла с данными и создает новый файл с сериализованным объектом.
public void Update(string filePath)
{
using var inStream = _reader.GetStream(filePath);
string line;
inStream.ReadLine();
while ((line = inStream.ReadLine()) != null)
{
var lineArr = line.Split(',', StringSplitOptions.RemoveEmptyEntries);
_dbAccess.AddTempPassport(new TempPassport
{
Series = lineArr[0].Trim(),
Number = lineArr[1].Trim(),
});
}
if(!_dbAccess.IsEmpty())
{
UpdateEvents();
}
_dbAccess.FillMainStorage();
}
Но всё это занимает слишком много времени и оперативки.Файл с данными содержит 5.000.000 строк (каждая строка - это отдельный объект и отдельный файл).
Объект (series: 1200, number: 107177) имеет путь FileDatabase\TempPassports\12\00\107\177\1200,107177.json
Ответы (1 шт):
Используйте архивы, так вы сможете освободить диск от нагрузки создания файла и обращения к нему. Создавайте Entry( ака File ) и используйте их через Stream. Ещё кстати, система тратит около 50 байтов на хранение пустого файла.