blockread (100分)

  • 主题发起人 主题发起人 Frank
  • 开始时间 开始时间
F

Frank

Unregistered / Unconfirmed
GUEST, unregistred user!
我用blockread读文件,感觉还不是很快.
请大家谈谈提高速度的办法.
 
呵呵,
这已经是最快的了,
看看是不是你的代码有什么问题?
试试加大blockread所读记录的个数。
 
to amo:
能否具体谈谈???
 
先说说你用Blockread读什么结构的文件吧!
 
to amo:
数据结构如下:
Type TMapinfo_map_head=record
Verinfo:string[30];
bound0_x:integer;
bound0_y:integer;
bound01_x:integer;
bound01_y:integer;
No_of_region:integer;
end;



type Tmap_polygon=record
No_of_point:integer;
mapinfo_points:array of Tpoint;
end;


type TMapinfo_Map_region=record
region_name:string[7];
No_of_region:integer;
regions:array of Tmap_polygon;
pen_define:string;
brush_color:string;
Center:string[10];
center_x:integer;
center_y:integer;
end;
 
唔,结构比较复杂。
这样的话用Blockread的优势不大。
不过还是可以利用的:
1。
type Tmap_polygon=record
No_of_point:integer;
mapinfo_points:array of Tpoint;
end;
中的mapinfo_points

2.

type TMapinfo_Map_region=record
region_name:string[7];
No_of_region:integer;
regions:array of Tmap_polygon;
...
end;
中的regions都需要读吧。

可以用blockread处理:
p: Pointer;

p:=regions;
Dec(PLongint(p));
Length := PLongint(p)^;
再用lenght为长度读regions的内容。
mapinfo_points可同样处理。

 
呵呵,错了一点,
上面的方法只能用于写,
要从文件中读的话,
最好在
Tmap_polygon中加入point_number
TMapinfo_Map_region中加入regions_number字段,
以便处理。
 
设置Config.sys
将Emm386.exe的D参数设的大一点即可。
 
to amo:
我先按你的建议试一试.多谢!
 
这个结构很难读写. 很多record的内容不能直接读出或写入, 只能自己处理, 比如:
TMapinfo_Map_region中的
pen_define:string;
brush_color:string

这两个都读不出, 只能自己处理(在record中不定长的string只保存了一个指
针指向具体的string, 所以它们的长度都是4字节--32bit, 直接读写只能得到
无效的数据).
 
eYes说的是,
string类型的数据应改为array [0..n] of char;
或用string再加上个表示字符串长度的字段,主要是方便读。
 
可以适当的加大blockread的缓存空间
 
可以试一下内存映像文件(Memory Mapped File),将要读的文件映像到
内存中,然后就可以用操作内存的方法访问该文件。 (没比较过速度,
应该会快一些吧,Windows中都是用这种方法把EXE载入内存的。)
 
内存映射文件可能也许个好办法,没试过!
 
接受答案了.
 
后退
顶部