Сценарий
У меня есть объект, который я преобразовываю в плоский CSV, а затем сжимаю и загружаю в хранилище файлов.
Я мог бы легко сделать это, выполнив следующие шаги.
- Преобразовать объект в файл CSV.
- Сжать файл
- Загрузить файл.
Однако
Я не хочуштраф за касание физической памяти, поэтому хотелось бы делать все это в памяти.
Текущая неправильная реализация
- Преобразовать объект в байтовый массив CSV
- Сжать байтовый массив
- Загрузка байтового массива в хранилище файлов
Проблема
По сути, я сжимаю массив байтов и загружаю его.что явно неправильно.(Потому что, когда сжатый файл Gzip несжатый, он содержит байтовый массив csv, а не сам фактический csv.)
Можно ли создать файл типа "file.csv" в памяти и затем сжатьчто в памяти вместо сжатия байтового массива?
Проблема, с которой я столкнулся, заключается в том, что мне кажется, что я могу назвать только файл и указать его расширение при сохранении в физическом месте.
Пример кода текущей реализации
public byte[] Example(IEnumerable<object> data)
{
// Convert Object to CSV and write to byte array.
byte[] bytes = null;
using (var ms = new MemoryStream())
{
TextWriter writer = new StreamWriter(ms);
var csv = new CsvWriter(writer);
csv.WriteRecords(data);
writer.Flush();
ms.Position = 0;
bytes = ms.ToArray();
}
//Compress byte array
using (var compressedStream = new MemoryStream(bytes))
using (var resultStream = new MemoryStream())
using (var zipStream = new GZipStream(compressedStream, CompressionMode.Decompress))
{
zipStream.CopyTo(resultStream);
zipStream.Close();
var gzipByteArray = resultStream.ToArray();
//Upload to AzureStorage
new AzureHelper().UploadFromByteArray(gzipByteArray, 0, gzipByteArray.Length);
}
}