怎么样比较快地读入很大的文本文件,比如100M.(50分)

G

gyne

Unregistered / Unconfirmed
GUEST, unregistred user!
不会是assign之后就一行一行地读入吧?
 
用memo控件加载试试,因为我没这么大的文本文件,不知道行不行
 
你用Notepad试一试,不等个好几分钟才怪。关键是你的目的是什么,如果不需要一次性
读入内存,那就分批读入。最好用一个固定大小的缓冲区(4M?),处理一批读取一批。
 
要实现如此快速的大文件载入,只能用内存映射
你在 windows 帮着里面敲入 CreateFileMapping 然后查找就知道了。
 
100M不是很大呀,一次分配100M内存然后一次读入就可以了。
var
buffer: pchar;
i, l: Integer;
begin
i := fileopen('test.txt', fmOpenRead);
l := fileseek(i, 0, 2);
getmem(buffer, l);
fileseek(i, 0, 0);
fileread(i, buffer^, l);
fileclose(i);
end;
 
100MB的文本没有见过
 
多线程啊,
用fileseek指定从何处读,
最好先读一段显示出来,剩下的多线程慢慢读。

 
有必要一次多那么多文件进来内存吗,一般是只读要显示的文件,分配一个缓冲,比如
1M左右的,要的时候在读进你的文件数据,把旧的覆盖就行了
 
可以先件个缩影,读的时候只读要显示的那个部分,或者有用的哪个部分。
 
如果要用TMemo控件加载,记住把WordWrap设置为False。
 
支持beta的观点,只能用文件映射
 
这样大量的数据,就不要使用文本文件拉
 
读文件的速度取决你的系统以及文件的大小。
 
文件映射
 
张无忌 说的有理,无法如何不能使用TMemo来读,在Win9X下,TMemo不支持大于64K文件的读取。
 
呵呵,楼上的说得不对,我试过了,用tmemo弄了个12M的文本,保存起来再打开,12M全部打开,你说能不能大地64K啊

100M算得过了什么,几G的你见过没有呀

包含所有字符的20位密码字典,你说有多大啊,嘻嘻
 
我是说在Win9X下有问题,在Win9X下用记事本打开一个大于64K的文件是,系统会提示使用写字板来打开,在NT/2000下没有这个限制

这个老兄提问有问题,应该说明是用于什么用途的,如果像楼上的那位老兄用于加载密码字典,那么分配一个100M的内存也不为过,如果是用于显示文本内容,则使用张无忌的方法,如果是进行文本内容扫描,则分配一个小于4M的内存就足够了。
 
定义两个缓冲区,把数据
分别读入两个缓冲区分别比较
没有别的方法!
 
张无忌:
有必要一次多那么多文件进来内存吗,一般是只读要显示的文件,分配一个缓冲,比如
1M左右的,要的时候在读进你的文件数据,把旧的覆盖就行了


请问如何实现这样的功能呢?
 
我想他说的可能先要知道文件的大小,然后一次读1M,在SEEK到第2M的开头位置,在读对不对。
 
顶部