delphi处理2G的文本,过滤重复行....(1分)

  • 主题发起人 主题发起人 gfwlxx
  • 开始时间 开始时间
G

gfwlxx

Unregistered / Unconfirmed
GUEST, unregistred user!
思陆1: list导入处理. 试都不用试,文件太大
思陆2: eof 处理..

可是我怎么写呢??
 
LIST导不进去。内存会溢出的。
 
你有时间 限制吗
比如 要 几秒内完成
要不要 忽略大小写?
要不要 trim
等等 ?

每行 的 一般 有多少 字符

是否 已经 排序的 ?
 
楼上在胡说吧?
几秒内完成?2G的数据几十分钟估计都不可能完成。
 
几秒 可能 做不到
几 分钟 是没问题
 
用内存映射嘛,毕竟内存映射是处理大文件比较好的方法
 
来自:hfghfghfg, 时间:2008-12-10 9:59:06, ID:3934660
几秒 可能 做不到
几 分钟 是没问题

----
你试过大数据吗?
你试试再说吧。
 
按照目前硬盘的速度,如果一秒读100M的数据,那2G的文本,至少要20秒才能读到内存当中,如果再写回硬盘,那至少还要20秒以上,加在一起,至少要40秒以上才行,但好象很少有硬盘能读到100M/秒,除非是服务器硬盘或是RAID。

而且全部读到内存中也不太可能,所以需要硬盘缓冲,所以时间会更长。

如果重复的记录非常多,有些算法可以对文本进行摘要提取,如不同,保存,如相同,删除,这样占用的内存会少些。
 
这么简单的问题,居然没人答的上. 嗨...
就是过滤重复行,不trim 不忽略,速度当然越快越好
 
方法也很简单. 何必写程序呢.
装了sql server 建个表,导入数据, 然后用sql server 去处理.

若你很固执的一定要程序去实现. 那就做用映像文件.
若你的行字节数一样长.
读长度子节, inc(Pword(*))
保存到数据库,(数据库做索引. 否则查找很慢, 索引后是2分法查找),

若你不保存到数据库, 写文件, 再用二分法查找, 我感觉效率没有sql server 高
 
这样算下来, 我估计 20分钟内, 应该就可以搞定. 几分钟的我不赞同. 若没有重复判断, 感觉几分钟可以完成.
 
几分钟有可能,LZ之意只是说过滤,过滤再写入文件,打个折,一半,处理后,打个比方有1G
那设读30s,写15s,满算1分钟
其它时间为处理时间
过滤处理可以这样,对每行进行N个hash{hash1, hash2, hash3},看是否重复大概就是比较三个hash的值,这样减少运算,一行处理过滤时间很少了,也就是几个比较命令。
这样的情况,几分钟是可以的。

以上,理想状态下。
 
可以使用树(多叉树),结合hash,即快又省内存

只要理解这种做法,具体实现也不复杂
 
嗯,list不是为操作大文件准备的。
对于大文件,较为理想的方式是用内存映射,然后分段做试图来处理。
否则,就算你有4个G的内存,用户态下的内存也还是只有2G可用,进程本身占了一部分,所以,2G的文件全部载入内存不可能。

除非是服务器操作系统,可以开3G用户内存使用[:D]
 
分段处理吧 一部分一部分排序 然后比较有序数据
 
不能一次全部加载到内存.
可以利用Hash算法
不管怎么样一定会非常慢
 
楼猪有意思,
“这么简单的问题,居然没人答的上. 嗨...
就是过滤重复行,不trim 不忽略,速度当然越快越好 ”

“这么简单的问题”自己都处理不了,想要别人的劳动成果的时候,还这样的态度,让人心寒!

老实和你讲吧,这个问题是能较快速的解决的,但是是一个商业解决方案,除非你出现钱!
 
一部分一部分加载进内存,用文件映射的方式...
用Hash加载,顺便算出长度..分配到不同桶上
 
后退
顶部