如何加快 StringGrid 的数据导入(100分)

  • 主题发起人 主题发起人 tjzxm08
  • 开始时间 开始时间
T

tjzxm08

Unregistered / Unconfirmed
GUEST, unregistred user!
上百万的数据如何加快导入StringGrid中。
如:
.....
with StringGrid do begin
RowCount := 1000000;
for k := 1 to 1000000 do Cells[0,k] := IntToStr(k);
end;
.....
实在太慢!!!!
 
Cols[0].text := ....
也不快!
 
这么大的数据量,如果总是在stringgrid上找速度快的方法,难。
另外,确实需要一次性载人到stringgrid吗?是不是可以考虑分段载入?
比如只是载入最上面显示的1000行,如果用户翻页到下面的时候,再载入。这样一部分一部分的做。否则,内存消耗是不是也会很大啊?
 
我见过一款商业软件,导入400多万行数据,不到1秒,看样子不像是分段导入的。看软件界面是 StringGrid.
 
你怎么判断是一次载入400万行?
我们这样假设。每页显示的数据是50行,
那么开始载入200行,你翻页的时候到20页的时候,程序计算数据位置以后马上载入,如果时间很短,用户是感觉不到的。
我猜测一次载入400万行的可能性不大。当然,是我个人猜测。
建议你可以使用分页技术。
 
他导入后,不做任何翻页操作,可以给数据排序,如果分页,怎么排序呢?
 
当然可以。对于大量数据,我们通常都使用sql语言进行数据排序。然后调出你需要显示的页码的数据。这个时候调出数据的时间很短,完全可以实现你这样的要求。不可能一次性载入到stringgrid的。
 
你看我下面一段sql代码,假设我在表中的号码是不重复的,我可以按照号码来进行分页,
其中 page_sum 是每页显示的数据行数, page_no是当然显示的页码,你传递到这个sql就可以实现分页。
select top page_sum a.* from 用户信息表 a where (a.号码 not in (select top (page_no-1)*page_sum c.号码 from 用户信息表 c ))
 
他的数据没用到数据库,因为数据可以随即生成,比如:
序号 | 随机数 | 随机数和
1 12578561233 43.00
.......
一直到400万
我想他也不可能一次性导入StringGrid,一定是用到了内存页面映射或其他什么技术,
否则这么大的数据排序(按随机数和)也不可能只用10几秒。
用TList做个记录类,可是排序后和其他数据对应起来,又会费相当的时间。
 
说明一下,我的机器P4 2.4,512M内存。
 
用Cols[0].LoadStream不知道会不会快些,没试过。
 
这么大的数据,如果排序可能需要的时候也不短吧,会不会在生成随机数的时候使用了什么方法
 
排序(按随机数和)9.8秒。
 
你使用Cols[0].LoadStream测试过吗?
 
刚才测试了。使用Cols[0].LoadStream也会觉得很慢。
 
对读入的文件,可否用:
var
MapFile: THandle;
MapFilePointer: Pointer;

MapFilePointer:=MapViewOfFile(MapFile,File_Map_All_Access,0,0,0);
cols[0].Text:=PChar(MapFilePointer);
.....
对于随机生成的数据,可否:
HMapFile := CreateFileMapping(....);
MapDataPointer:=MapViewOfFile(HMapFile, FILE_MAP_WRITE, 0, 0, 0);
cols[0].Text:=PChar(MapDataPointer);
 
我也关心这个问题,帮顶![:D]
 
后退
顶部