Как сжать экземпляр объекта .NET с помощью gzip

В Oracle 12C вы можете использовать лимит LIMIT и OFFSET для нумерации страниц.

Пример. Предположим, у вас есть таблица tab, из которой необходимо извлечь данные на основе столбца DATE типа данных dt в порядке убывания с разбивкой на страницы.

page_size:=5

select * from tab
order by dt desc
OFFSET nvl(page_no-1,1)*page_size ROWS FETCH NEXT page_size ROWS ONLY;

Объяснение:

page_no = 1 page_size = 5

OFFSET 0 ROWS FETCH NEXT 5 ROWS ONLY - Выбрать только первые 5 строк

page_no = 2 page_size = 5

OFFSET 5 ROWS FETCH NEXT 5 ROWS ONLY - получить следующие 5 строк

и т. д.

Референсные страницы -

https://dba-presents.com/index.php/databases/oracle/31-new-pagination-method-in-oracle-12c-offset-fetch

https://oracle-base.com/articles/12c/row-limiting-clause-for-top-n-queries-12cr1#paging

5
задан Matt Peters 8 June 2009 в 12:33
поделиться

2 ответа

Это не будет работать для любого ссылочного типа . Это будет работать для Сериализуемых типов. Подключите BinaryFormatter к потоку сжатия, который передается в файл:

var formatter = new BinaryFormatter();
using (var outputFile = new FileStream("OutputFile", FileMode.CreateNew))
using (var compressionStream = new GZipStream(
                         outputFile, CompressionMode.Compress)) {
   formatter.Serialize(compressionStream, objToSerialize);
   compressionStream.Flush();
}

Вы можете использовать MemoryStream для хранения содержимого в памяти, а не для записи в файл. Однако я сомневаюсь, что это действительно эффективное решение для кеша.

20
ответ дан 18 December 2019 в 06:12
поделиться

Какие объекты вы помещаете в кэш? Это типизированные объекты? Или что-то вроде DataTable ? Для DataTable , возможно, сохраните как xml, сжатый через GZipStream . Для типизированных (сущностных) объектов вам, вероятно, потребуется сериализовать их.

Вы можете использовать BinaryFormatter и GZipStream , или вы можете просто использовать что-то вроде protobuf- net сериализацию (бесплатно), которая уже очень компактна (добавление GZipStream обычно увеличивает размер данных - что типично для плотных двоичных файлов). В частности, преимущество таких вещей, как protobuf-net, заключается в том, что вы получаете уменьшенный размер без необходимости оплачивать затраты ЦП за его разархивирование во время десериализации. В некоторых тестах до добавления GZipStream он был в 4 раза быстрее, чем BinaryFormatter . Добавьте дополнительное время на BinaryFormatter для GZip, и он должен выиграть с значительной разницей.

3
ответ дан 18 December 2019 в 06:12
поделиться
Другие вопросы по тегам:

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