关于内存流的的CopyFrom速度问题

h98458 2009-07-24 11:49:04
vMemoryStream:=TMemoryStream.Create;
vFileStream:=TFileStream.Create(mFileName,fmOpenRead or fmShareDenyNone);
...
...
...
vMemoryStream.Clear;
vMemoryStream.CopyFrom(vFileStream,StrToIntDef(StrRight(StrRight(vFileInfo[I],'|'),'|'), 0));
vMemoryStream.Position:=0;
---------------------------------------------------------------------------------------
当StrToIntDef(StrRight(StrRight(vFileInfo[I],'|'),'|'), 0)数值很大时发现速度很慢很慢,请问如何解决?
有什么好的办法吗?
或者如果用文件流替代会不会好点,怎么用?
...全文
265 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
h98458 2009-07-27
  • 打赏
  • 举报
回复
自己再顶顶,看看高人们有什么好办法
h98458 2009-07-27
  • 打赏
  • 举报
回复
解决了:
rSize := StrToIntDef(StrRight(StrRight(vFileInfo[I],'|'),'|'), 0);
vMemoryStream.setsize(rSize);//加上这句
vMemoryStream.CopyFrom(vFileStream,rSize);
vMemoryStream.Position:=0;

谢谢二楼
minizhuxianchun 2009-07-27
  • 打赏
  • 举报
回复
哦,忘了先分配内存了:
vMemoryStream:=TMemoryStream.Create;
vFileStream:=TFileStream.Create(mFileName,fmOpenRead or fmShareDenyNone);
...
...
...
vMemoryStream.Clear;
vMemoryStream.Size:=size;
vFileStream.ReadBuffer(vMemoryStream.Memory^,size);
//CopyMemory(vMemoryStream.Memory,vFileStream.Memory,size);//有可能要判断一下文件不能太巨大
//vMemoryStream.CopyFrom(vFileStream,StrToIntDef(StrRight(StrRight(vFileInfo[I],'|'),'|'), 0));
vMemoryStream.Position:=0;
飞天揽月 2009-07-26
  • 打赏
  • 举报
回复
呵呵
minizhuxianchun 2009-07-24
  • 打赏
  • 举报
回复
哦,忘了先分配内存了:
vMemoryStream:=TMemoryStream.Create;
vFileStream:=TFileStream.Create(mFileName,fmOpenRead or fmShareDenyNone);
...
...
...
vMemoryStream.Clear;
vMemoryStream.Size:=size;
CopyMemory(vMemoryStream.Memory,vFileStream.Memory,size);//有可能要判断一下文件不能太巨大
//vMemoryStream.CopyFrom(vFileStream,StrToIntDef(StrRight(StrRight(vFileInfo[I],'|'),'|'), 0));
vMemoryStream.Position:=0;
minizhuxianchun 2009-07-24
  • 打赏
  • 举报
回复
{不要用CopyFrom这个函数,效率不高.
下面的函数体有每次拷贝的大小:
MaxBufSize = $F000;
先读出到缓冲区,再拷贝到内存流,有两次动作.
所以文件比较小时无所谓,大时就很慢的原因
}
function TStream.CopyFrom(Source: TStream; Count: Int64): Int64;
const
MaxBufSize = $F000;
var
BufSize, N: Integer;
Buffer: PChar;
begin
if Count = 0 then
begin
Source.Position := 0;
Count := Source.Size;
end;
Result := Count;
if Count > MaxBufSize then BufSize := MaxBufSize else BufSize := Count;
GetMem(Buffer, BufSize);
try
while Count <> 0 do
begin
if Count > BufSize then N := BufSize else N := Count;
Source.ReadBuffer(Buffer^, N);
WriteBuffer(Buffer^, N);
Dec(Count, N);
end;
finally
FreeMem(Buffer, BufSize);
end;
end;

vMemoryStream:=TMemoryStream.Create;
vFileStream:=TFileStream.Create(mFileName,fmOpenRead or fmShareDenyNone);
...
...
...
vMemoryStream.Clear;
CopyMemory(vMemoryStream.Memory,vFileStream.Memory,size);//有可能要判断一下文件不能太巨大
//vMemoryStream.CopyFrom(vFileStream,StrToIntDef(StrRight(StrRight(vFileInfo[I],'|'),'|'), 0));
vMemoryStream.Position:=0;
ahjoe 2009-07-24
  • 打赏
  • 举报
回复
先分配好空间试试

rSize := StrToIntDef(StrRight(StrRight(vFileInfo[I],'|'),'|'), 0);
vMemoryStream.Size := rSize;
vMemoryStream.Position:=0;
vMemoryStream.CopyFrom(vFileStream,rSize);
...
ahjoe 2009-07-24
  • 打赏
  • 举报
回复
你这个数值很大,就是复制的数据量大,花的时间自然就长了
shuaialang 2009-07-24
  • 打赏
  • 举报
回复
听说这个NTFS磁盘的效率比fat32效率高好多倍。。
h98458 2009-07-24
  • 打赏
  • 举报
回复
还是没有解决,感觉非要用CopyFrom不可,不用根本没办法弄
h98458 2009-07-24
  • 打赏
  • 举报
回复
h98458 2009-07-24
  • 打赏
  • 举报
回复
上楼的:
CopyMemory(vMemoryStream.Memory,vFileStream.Memory,size);//有可能要判断一下文件不能太巨大
中的:vFileStream.Memory从哪来?

16,748

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 语言基础/算法/系统设计
社区管理员
  • 语言基础/算法/系统设计社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧