У меня есть требование архивировать все данные, используемые для ежедневного создания отчета. Я сжимаю большую часть данных с помощью gzip, так как некоторые из наборов данных могут быть очень большими (10mb +). Я пишу каждый отдельный график protobuf в файл. Я также переименовываю фиксированный набор известных типов малых объектов и добавляю некоторый код, чтобы определить, был ли файл gzipped или нет, когда я его прочитал. Это связано с тем, что маленький файл при сжатии может быть больше, чем несжатый.Gzip только после достижения порога?
К сожалению, только из-за характера данных у меня может быть только несколько элементов более крупного типа объекта, и подход с белым списком может быть проблематичным.
Есть ли способ написать объект потоку и только если он достиг порога (например, 8kb), а затем сжимает его? Я заранее не знаю размер объекта, и иногда у меня есть граф объектов с размером IEnumerable<T>
, который может быть значительным по размеру.
Редактировать: Код довольно простой. Я просмотрел тот факт, что храню его в таблице filestream
db. Это не имеет особого значения для цели реализации. Я удалил часть постороннего кода.
public Task SerializeModel<T>(TransactionalDbContext dbConn, T Item, DateTime archiveDate, string name)
{
var continuation = (await dbConn
.QueryAsync<PathAndContext>(_getPathAndContext, new {archiveDate, model=name})
.ConfigureAwait(false))
.First();
var useGzip = !_whitelist.Contains(typeof(T));
using (var fs = new SqlFileStream(continuation.Path, continuation.Context, FileAccess.Write,
FileOptions.SequentialScan | FileOptions.Asynchronous, 64*1024))
using (var buffer = useGzip ? new GZipStream(fs, CompressionLevel.Optimal) : default(Stream))
{
_serializerModel.Serialize(stream ?? fs, item);
}
dbConn.Commit();
}
Try читать 8k, если есть меньше данных, выход в несжатом. В противном случае gzip весь поток, включая начальный 8k? Какова ваша конкретная проблема? –
Проблема в том, что у меня есть только 'T model', и я передаю ее protobuf' .SerializeWithLengthPrefix', если объект 1 байт или 100 Мб, я понятия не имею. –
Ну, вы подключаете выходной поток. Этот экземпляр потока должен буферизировать 8k данных, а затем решить, что делать. Затем он может передавать распакованные или сжатые данные в другой поток. –