TMemoryStream 操作的效率问题(200分)

  • 主题发起人 主题发起人 S3D4
  • 开始时间 开始时间
S

S3D4

Unregistered / Unconfirmed
GUEST, unregistred user!
谁知道 TMemoryStream 如何插入、删除 TStream 操作,我需要大量 Stream 操作,关键是
如何在不建立临时 MemoryStream 进行 CopyForm 操作,因为 Stream 非常大,有几十 M,
操作又非常平凡,要达到实时操作,所以需要考虑效率问题

procedure AddStream(var TMemoryStream, TStream, InsertPosition);
procedure DeleteStream(var TMemoryStream, StartPosition, EndPosition);
 
TMemoryStream操作的速度是很快的,
但是如果太大,则最好使用文件流
 
我试过,在 P4 1.6+512M的机器里面操作(其实是网络媒体截获流),延迟很厉害,所以问问
如何直接内存操作进行 MemoryStream 的插入、删除
 
To S3D4:也是关于流的问题
烦请相助 http://www.delphibbs.com/delphibbs/dispq.asp?lid=1535254
 
我自己还是半桶水,你还敢让我帮你?
 
对TMemoryStream.Memory直接操作?

不过我觉得这样不好。

能不能说说你要实现的功能,看看有没有别的解决办法。
 
这是我自己写的,好像有问题,高手们看看吧

procedure DeleteMemoryStream(var Stream: TMemoryStream
StartPosition, EndPosition: Int64);
var
PSource, PDest: ^Byte;
begin
PSource:= Stream.Memory;
Inc(PSource, StartPosition);
PDest := PSource;
Inc(PDest, EndPosition - StartPosition);
System.Move(PSource^, PDest^, Stream.Size - EndPosition);
// Windows.MoveMemory
end;

InsertMemoryStream 我就不知道如何写了,谁能帮手?
 
用字符串来操作吧,完全可以满足你的要求,
并且还有标准的函数可以调用

procedure Delete(var S: string
Index, Count:Integer);
procedure Insert(Source: string
var S: string
Index: Integer);

字符串最大可以达到2GB,操作起来方便,也不会有内存泄漏
最好的解决方法了
 
LiChaoHui 兄说笑了,我这里大量基于 PByte 的位移、异或操作怎么办,16 进制数据查找
怎么办呢?
 
你刚才写删除过程没有改变流的Size属性,到时候会有问题的。
如果你嫌弃流的操作慢,为何不自己从头包装一个呢?
给你几个API
CopyMemory(MoveMemory)
FillMemory
GetMemory
 
Delphi的帮助里面说过,更改TStream的size属性没有意义,所以没有改动,不过让我试试
 
这位老兄,我绝对没有说笑,很严肃的!!
你可以定义一个PByte的指针, var PData: PByte;
然后,取字符串首地址,转化为PByte类型
PData := PByte(PChar(S))
//注意,一定要这样写
对于PByte,你做什么操作应该都可以的,移位,异或,
至于查找,用字符串操作函数效率更高
function Pos(Substr: string
S: string): Integer;

我相信,用字符串操作绝对没有问题,有现成的函数可用,
效率更高,也不用分配内存和释放内存,不用担心内存泄漏,
之所以能够这样,是因为Delphi中的字符串,是不同于c中的字符串的,
他不是0结尾的,不用担心会丢失0后面的东西
字符串查找Pos也能够处理#0字符,不信你可以试试

如果字符串可以解决你的问题,把你的200分全给我!
我相信绝对可以!这是最好的解决方法了
 
试验证明修改 TMemoryStream Size 属性的确有效,请问wr960204,
这种操作会有什么问题的 ???
 
插入就意味着移动,要尽量避免插入
 
LiChaoHui 兄,不要恼火,我的代码基本已经定型,你让我做如此改动是不是要杀了我,我
现在只考虑在现有基础上做轻微改动来提高效率,当然如果还是不理想我会考虑您的建议,
至于这 200 分,身外之物,,大家共同探讨,不必太过执着吧
 
LiChaoHui 兄,Delphi 里面的字符串 AnsiString 也是 chr(0) 结尾的,印象里面它的内
存架构和 PChar 相似,只是在String 的首部多了一个标志位表明 String 的长度,也许有
错,欢迎指正

 
Move的意思是拷贝内存,但是丢弃的如何做?它给你自动丢掉了吗?自己写个TMemoryStream吧?不要偷懒!^_^
 

Similar threads

S
回复
0
查看
835
SUNSTONE的Delphi笔记
S
S
回复
0
查看
765
SUNSTONE的Delphi笔记
S
S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
后退
顶部