压缩OLEVARIANT数据

TCLIENTDATASET.DATA, TCLIENTDATASET.DELTA, TDATASETPROVIDER.DATA,它们的DATA属性的类型都是OLEVARIANT。

中间层和客户端之间通过OLEVARIANT来传递数据集的数据。

为了提高数据传输的效率,发送方在传输之前可以先压缩数据,然后把压缩的数据发送给接收方。

接收方收到发送方送来的压缩数据,先进行数据解压。

使用开源的ZLIB进行数据的压缩和解压。XE2已经自带此控件,需要引用system.zlib单元。

原理:将OLEVARIANT数据流化,然后对流进行压缩,还原成OLEVARIANT以后再发送。

procedure StreamToVariant(Stream: TStream; var V: OLEVariant);
var
  P : Pointer;
begin
  try
    V := VarArrayCreate ([0, Stream.Size - 1], varByte);
    P := VarArrayLock (V);
    Stream.Position := 0;
    Stream.Read (P^, Stream.Size);
    VarArrayUnlock (V);
  except
    Exit;
  end;
end;

procedure VariantToStream(const V: OLEVariant; Stream: TStream);
var
  P: Pointer;
begin
  try
    Stream.Position := 0;
    Stream.Size := VarArrayHighBound (V, 1) - VarArrayLowBound (V, 1) + 1;
    P := VarArrayLock (V);
    Stream.Write (P^, Stream.Size);
    VarArrayUnlock (V);
    Stream.Position := 0;
  except
    Exit;
  end;
end;

function CompressData(V: OleVariant): OleVariant;
var
  M, M0: TMemoryStream;
begin
  try
    M := TMemoryStream.Create;
    M0 := TMemoryStream.Create;
    try
      if V = Null then exit;
      VariantToStream(V,M);
      M.Position := 0;
      ZCompressStream(M, M0);
      StreamToVariant(M0, V);
    finally
      M.Free;
      M0.Free
    end;
    Result := V;
  except
    Exit;
  end;
end;

function DeCompressData(V: OleVariant): OleVariant;
var
  M, M0: TMemoryStream;
begin
  try
    M := TMemoryStream.Create;
    M0 := TMemoryStream.Create;
    try
      if V = Null then exit;
      VariantToStream(V,M);
      M.Position := 0;
      ZDeCompressStream(M, M0);
      StreamToVariant(M0, V);      
    finally
      M.Free;
      M0.Free
    end;
    Result := V;
  except
    Exit;
  end;
end;

http://www.cnblogs.com/hnxxcxg/archive/2012/02/26/2368612.html

时间: 2024-08-27 04:26:07

压缩OLEVARIANT数据的相关文章

压缩Sqlite数据文件大小,解决数据删除后占用空间不变的问题

最近有一网站使用Sqlite数据库作为数据临时性的缓存,对多片区进行划分 Sqlite数据库文件,每天大概新增近1万的数据量,起初效率有明显的提高,但历经一个多月后数据库文件从几K也上升到了近160M,数据量也达到了 40多万条,平均每一条数据占用了 4K的空间,虽然使用上的效率直观上没有造成太大的影响,但服务器的占用内存却比原来多占用了20%左右.今天刚好打算清除一个Sqlite的冗余数据, 将保留最近10天的数据就可以了,结果执行了删除指令delete后删除30多万条数据保留了10多万数据,

php curl采集,服务器gzip压缩返回数据怎么办

一般服务器不会胡乱返回gzip压缩的数据,一般是客户端请求的头部里包含你浏览器能接受的压缩方式, Accept-Encoding:gzip,deflate,sdch 这里是gzip .deflate.sdch这三种方式,这里不一一说明是指什么,不懂的可以去找谷哥度娘, 有些服务器强制返回gzip压缩的数据,我们采集的时候,返回的是乱码,根本无法读取使用,这个时候马上查看手册 发现其实curl里有个参数,curl_setopt($ch, CURLOPT_ENCODING,'gzip'); 手册解释

WebApi Gzip(Deflate) 压缩请求数据

由于不能直接访问指定数据库,只能通过跳板机查询Oracle数据,所以要做一个数据中转接口, 查询数据就要压缩,于是就找资料,代码如下,其中要注意的是Response.Headers.Remove("Content-Encoding"); 这段,对Response.Headrs的操作如果IIS6是不支持的, 会出现如下错误: 接口出现错误:"此操作要求使用 IIS 集成管线模式." () System.PlatformNotSupportedException: 此操

Sql Server Data compression 预估和选择,以及查看成功压缩的数据页

Sql Server提供两种数据压缩的方式:row压缩和page压缩.两种压缩的内部原理暂且不论,只要知道压缩率越高,节省的disk space 更多即可.sql server 提供多种工具,供DBA查看压缩的效率. 1,查看表的压缩类型 在sys.partitions中的两个字段data_compression 和data_compression_desc ,Indicates the state of compression for each partition. 使用sys.allocat

压缩请求数据(优化页面加载太慢之一)

1 /// <summary> 2 /// 允许压缩 3 /// </summary> 4 public class AllowCompressAttribute : System.Web.Mvc.ActionFilterAttribute 5 { 6 /// <summary> 7 /// 压缩方法 8 /// </summary> 9 public override void OnResultExecuting(ResultExecutingContex

InnoDB 数据表压缩原理与限制

http://liuxin1982.blog.chinaunix.net/uid-24485075-id-3523032.html 压缩理念 通过提高CPU利用率和节约成本,降低数据库容量及I/O负载,从而使数据吞吐率得到显著提高. 压缩原理 压缩表减少了磁盘上数据库的大小,使得用户不必频繁地操作写入和读取便可以访问数据.对于 InnoDB的工作量以及传统的用户表而言(特别是在某些读取密集型的应用中,内存有足够的空间存储常用数据),数据压缩不仅大大减少了数据库所需的存储空间,而且还减少了 I/O

压缩 MongoDB 的数据文件

MongoDB采用了磁盘空间预分配的机制,为了避免磁盘碎片以及使用mmap后造成的近一步的内存碎片,但是随着数据的增删除改操作,数据文件不可避免的会产生空洞,造成磁盘空间和内存的浪费.本文说的是这方面的压缩,数据使用某些压缩算法进行压缩的讨论不在此范围. 在MongoDB 中,大概有两种方法可以解决这种问题,但是都不是无痛方式,所以并不推荐使用. 1.通过 repairDatabase 整理数据文件 repairDatabase 是MongoDB 内置的一个db 上的方法,调用这个方法,Mong

数据的压缩1 (51)

1 以下是在某个servlet中对指定的数据进行压缩: package cn.hongxing.servlet; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.OutputStream; import java.io.PrintWriter; import java.io.StringReader; import java.util.zip.GZIPOutputStream; im

如何实现HttpClient + Web Api架构下数据的压缩

随着移动互联网的发展,各种终端设备的流行,服务器接口要求统一,这个时候RESTful就有用武之地.RESTful一种软件架构风格,而不是标准,只是提供了一组设计原则和约束条件.ASP.NET WebAPI,其核心概念就是构建REST风格的Web服务,把一起数据视为资源,无论是服务请求或者是数据操作. HttpClient + Web Api实现Restful服务 下面实现了提交一个对象json数据到服务器上请求创建操作,对应Http的POST请求. 1)  准备需要传递给WebAPI的参数 2)