如何快速的读写文本文件的某一行(100分)

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

firstshine

Unregistered / Unconfirmed
GUEST, unregistred user!
一个文本文件,大约1000000行到2000000行,每一行的字符数不等,文件大小可能有100M,现在请问,如何快速的读谢某一行。

我想,定位是关键,对吗?
 
建議把文件細分為1000個文件,每個文件1000行,這樣就快很多了,需要時再合併文件..
或者把文化全部載入ram中操作...
 
readln
read
 
把每行都用空格凑成等长的,这样就可随机访问了.
 
如果每行都用空各凑成等长的,那么这个文件所占用的空间就不会是100M了,可能会达到1G以上
 
用 数据库来保存吧
 
数据库的性能不行,和文件比差远了
 
“数据库的性能不行,和文件比差远了” 你是否没有给表加索引呀
 
那就只有用lance2000的方法了,楼主要求快速读写某一行,在写的时候,那行的长度一旦改变(说极端点:就改写第一行)文本文件的操作不会是快速的。
 
用数据库,每行一个记录,想要哪行就select * from table where id=###
这时候是文件不能与数据库相比。要是闲数据库安装麻烦,就下个mysql,不用安装,要用的时候就启动,不用就关掉,不浪费资源,只占用一点硬盘空间,系统重装也不用管。
 
还有一个办法, 就是在文件的头部增加一块数据,记录各行的长度。然后使用随机方式访问文件,使用时要计算指定行的开始位置。
 
Agree:skadon
大文本不适合查询和修改。
 
../Borland/Delphi6/Demos/Db/TextData
看看这个能不能帮点忙?每行的长度是可变的...

 
1. 简单的办法,一次性将文件读入内存,即使用TStringList进行处理,但可能需要Delphi7版本以上。这样的话,随机读写都比较灵活,文件的装入和保存速度也都还可以。这是简洁的办法。
2. 笨一点的办法,定义一个不定长的字符串类型数组变量(如 tmpArray: array of string
长度视文件行数变化 ),这样虽然不失读写的灵活性,但文件的装入和保存非常慢,而且可变类型数组操作远不如TStringList类型来得方便。
3. 第三种方案,化整为零,即将文件读入若干个内存块进行处理,参考方法1。对于几百MB的文件可以考虑。但以个人的经验来看,100MB以内的文件一次性读入并不是什么大问题。
4. 就庞大规模的文件,如几百MB的文件而言,可以考虑索引技术。用一个索引文件计录数据文件各行的位置和长度,但由于数据文件是线性存储的,行内容的修改并不轻松,需要特殊的处理。人们可能想到不同的方法,但需要实践测试之后才好说。弊人以为,用好TStrings类型进行灵活的处理是上策。
 
后退
顶部