当前位置:编程学习 > VB >>

不可思议的秒级文件处理算法?

我现在有7个文件,大小分别为 2K,20K,200K,2M,20M,200M,2G
这些文件中的内容都是分行的(即一行一条数据)
不同的文件中可能存在相同的数据,比如 2K的文件中含有字符"abcdef" 200M的那个中也有"abcdef"
现在我需要将这些文件中不相同的内容(相同的部分只去一个,过滤掉重复的)全部整理到另外一个单独的文件中去,采用什么样的算法能够最快最高效!有没有可能在秒级完成? --------------------编程问答-------------------- 你换个超级计算机就算你算法差肯定也可以秒级完成。

你知道为什么数据查询可以那么快吗?回答你:是应为数据库是有特定结构的。
在一个没有对数据结构进行优化处理的数据要进行处理,必须慢慢轮询,这种过程必定要耗时间,而要想缩短这种时间,只有提高硬件速度。
除非你的数据本来就存在一定的分析规范和结构体系,否者这肯定会是一个漫长的过程。 --------------------编程问答-------------------- 换个问法,最高效的算法可以达到什么级别,
A 秒级别
B 分级别
C 2小时内
D 3小时内
E 3小时已经是最大忍耐限度了

硬盘配置:
四核 AMD/或 I7
MEM  4G~8G
显卡 2G 带GPU
--------------------编程问答-------------------- 你要知道,你这种属于数据对比过程,不是什么算法问题,要提高速度除了优化数据结构以外,就是讲究合理的利用缓存与数据的读写方式,或者换个运行效率较高的开发工具来处理。
不说别的,就单纯的文件读写速度来说,读写数据的缓存大小设置因机器而已都会有不同,有些机器每次处理4K速度快,有些是8K,有些可能是2K。VB的运行效率本来就不高,也不是很适合做比较大量的数据对比工作,应为这会觉得很慢,虽然能做,不过效率要低过VC的几十倍。当然可以通过交互界面让人不感觉到这种过程有那么久,不过这种是实在没有办法的情况下用的招。如果说VB用相同的算法和过程要处理25秒,VC可能只需要800毫秒,这是我曾经测试的结果。你要提高效率,如果单纯是这种对比,建议用VC来做,如果不会VC,可以用VC写API函数给VB调用,其他的就是基本的循环判断语句或数组操作,花个几分钟就能了解C语言的这些东西。
给你介绍VC中API接口的处理方法,用这种VB+VC的架构应该能提高整个过程的处理速度。
http://blog.csdn.net/supermanking/article/details/5347763 --------------------编程问答-------------------- sorry,C我也会的,我只是想多发几个板块寻求更多的信息 --------------------编程问答-------------------- 既然你会C语言,那干嘛不直接用C语言做个这种程序对比看看,看看实际需要多少时间不就可以了。相对来说,这种东西没什么算法可言,如果要说到算法,就是做字符串或是数据行的特征码来对比,在轮询每一个字节的过程中,计算那一行字符串的异或校检码或CRC码之类的东西,当读完一行,并取得那一行的校检码,就与先前的校检码数组做对比,如果不存在,就加入校检码数组,并做行标记,如果存在,在与先前相同校检码的行标记的行内容做具体对比,这种方法就有点像GIF文件格式的压缩数据方法,不过这种过程能不能起到缩短对比时间的作用要看数据的,搞不好还没有直接对比快。但总之,不去做是不知道结果如何的,这样的对比也不算很难,建议你做一个看看如果不能满足需求再问问题。 --------------------编程问答-------------------- VB 加载300万行数据,最快需要7秒,用占内存的方法,一下子全部读入那种,如果上G,只有分段读了,再加比对,2G数据估计要几分钟 --------------------编程问答-------------------- 用文件来存储数据,那是最原始的数据库设计.数据库一开始就是直接用文件存储的.

数据库已经发展到现在了,为什么要把上G的数据保存在一个文件里来进行处理呢?

答案,您最好到数据库版去求救,想想办法把数据放到数据库里,然后建个索引,只要索引建得合适,即使上G的,查询速度也会是在秒级.
--------------------编程问答-------------------- 另外,关于硬件,有几个看法:
1.AMD 相对于Intel,CPU性能差太多.
2.显存大小对您的"算法"基本不搭界.
3.显卡貌似都是带GPU的. --------------------编程问答-------------------- 你这个需求,应该说,还是有些算法技巧的。

1.

要查询两个分别有 n1 条记录和 n2 条记录的文件中记录的异同,则需要读取记录并进行比较的次数是 n1 x n2 次。

如果你把这 7 文件两两比较,需要比较 n1 x n2 x n3 x n4 x n5 x n6 x n7 次。这是一个很大的数字。

实际上,你可以首先把前 6 个小文件无条件合并,然后用合并的文件与最后一个大文件进行逐记录比较。注意,凡是不重复的数据,立即加入到大文件中。也就是说,下一次将参与比较。

你需要的比较次数是 (n1 + n2 + n3 + n4 + n5 + n6) x n7。

如果文件内部也可能有重复记录,稍麻烦一点。你需要检查大文件内部的重复记录。即,将大文件逐条写入临时文件时,逐条检查记录是否已存在于临时文件中。

此时,你需要的比较次数是 (n1 + n2 + n3 + n4 + n5 + n6) x n7 x n7。

2.

VB 的字符串比较是很缓慢的。

建议在 VC++ 中采用二进制字节逐个比较。

一条记录不要无条件地比到底,只要发现了不相等的字节,立即返回。

等等…… --------------------编程问答-------------------- 一般来说,VB : VC 程序执行花费的时间 5:4 左右是正常的,相差太大就是编程水平的问题了。

大数据量的处理,必定要用到外存,看你机器内存足够,拿出 6G 用来做模拟硬盘。
1)将所有数据分成每份 1K 条记录,这 1K 条记录在内存中排序、去除重复项后分别存成文件到模拟硬盘。
2)然后不停用归并排序法(改进是需要去除重复项)将每 2 个文件合并成更大的文件,并删除原先的两个小文件。
3)最终一个大文件就是结果。
这样的算法耗时最多是分级别的。

如果要利用4核CPU:
步骤 1) 中将小数据文件平分到 4 个目录中。
步骤 2) 同时运行 4 个程序实例分别处理一个目录。
步骤 3) 需要将 4 个文件再运用改进的归并排序法合并成最终结果。
--------------------编程问答--------------------
引用 10 楼 Tiger_Zhao 的回复:
一般来说,VB : VC 程序执行花费的时间 5:4 左右是正常的,相差太大就是编程水平的问题了。

大数据量的处理,必定要用到外存,看你机器内存足够,拿出 6G 用来做模拟硬盘。
1)将所有数据分成每份 1K 条记录,这 1K 条记录在内存中排序、去除重复项后分别存成文件到模拟硬盘。
2)然后不停用归并排序法(改进是需要去除重复项)将每 2 个文件合并成更大的文……

4核超线程技术,用云技术不是更好,呵呵 --------------------编程问答-------------------- 弄一个大个的哈希表行不行呢?
把7个文件中的每一条记录都算一下哈希值,然后塞到哈希表里面去。插入的过程去掉重复元素。 --------------------编程问答--------------------
Quote: 引用 11 楼 SupermanKing 的回复:
4核超线程技术,用云技术不是更好,呵呵
Quote:

云是狗屁:
云存储——不就网盘么
云服务——不就是在线更新么
云计算——普通应用 CPU 不是瓶颈。 --------------------编程问答-------------------- 对于目前较为普遍的个人电脑而言,要做到对上G的数据进行字符串分析还要达到秒级,这也叫普通应用?

虽然我没有实际测试过,但从理论看,如果一台计算机分析2G以上的这种无规律字符串数据,相信处理时间怎么都不太少吧?如果把这些时间都摊开来让其他的计算机帮忙运算,肯定能提高效率。其实这和你介绍的超线程技术并无冲突,因为他们的理念是相同的,只不过在相同数量的超线程要比这种云架构高效而已,但云的优势就是数量多,在数量上可远超这种多核CPU的核心数,所以云技术并不是没有优势的。特别是在大量的数据任务运算中,更能体现云的价值,当然,如果做1000个循环这种小事也用云,肯定没法和这种超线程比,甚至比单线程还慢,因为云还要等网络信息的反馈等东西,但数据量一大,云端机一多,这种架构的运算效果就会远超这种单纯的超线程技术,毕竟云端也可超线程,云+超线程,可以想像是多么壮观的运算场面。 --------------------编程问答-------------------- 云计算适合普通PC搞不定的情况,哈哈. --------------------编程问答-------------------- 嘿嘿,2G文件,机械硬盘秒级是不可能了,必须是SATA3的固态硬盘。 --------------------编程问答-------------------- 项目的背景是这样的,我这里有好几个字典文件,最大的大概在3G不到,但是由于时间太长,字典中可能含有很多重复的数据,所以我想把这些字典中重复的部分剔除掉,然后整合到一个全新的字典文件中去 --------------------编程问答-------------------- 学习了。谢谢 --------------------编程问答-------------------- 我在10楼说了,估计是“分”级别的。

其实应该用数据库的,即可以用主键保证唯一性,又有了索引查询性能也有提高。 --------------------编程问答-------------------- 嗯,如老虎所说,数据库是首选,可以利用全文索引或字典来提高速度。
其次,大文件夹不要直接读到内存中,要用内存映射方式+VB模拟指针来搜索,我以前曾经实验过,较大的文件使用内存映射+VB模拟指针的方式比直接使用VB内置命令快上近100倍,具体代码可参见我实验后写的一篇文章《VB快速查找大型文件中包含的字符串 》。 --------------------编程问答-------------------- 把数据处理做在控件上,用控件数组多线程执行.会快很多,但是秒级比较难,除非你的电脑超级快 --------------------编程问答-------------------- 除
补充:VB ,  基础类
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,