txt文件(百万条记录)

sharp0309 2010-03-24 10:47:40
txt文件(百万条记录,里面好多不同的重复行,重复行都在一起 找出其中重复行数最多的一个输出
如:1111
1111
1111
222
222
22
22
...全文
253 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
hzy694358 2010-03-24
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 chen_wenyue 的回复:]

这个很简单啊,不明白你提这个问题是想得到什么?代码?思路?
你设两个变量,一个存当前行,一个存上一行,再设两个变量进行累加,一个是上个重复串的次数,一个是当前串的重复次数,然后在串改变时,进行比较,如果当前大,就更新。唯一注意的就是,如果文件较大,需要开个缓冲区进行分段读取,在缓冲区更新时特别处理一下,有可能要回退读取。伪代码如下:
CString strOldString,strNewSt……
[/Quote]
你这种方法你自己觉得得用多久时间才能过滤完呢
那可是百万条记录……
qiangorqiang 2010-03-24
  • 打赏
  • 举报
回复
如果重复的都都在一起,那用一个变量记录重复次数,当遇到相同的内容,变量加1,如果不同变量清0。然后再用一个变量记录最大次数,在计数变量清0前比较最大次数与计数变量大小,记录打的。循环后可得到重复最多的。
peachbrandy1 2010-03-24
  • 打赏
  • 举报
回复
百万行恐怕最大的问题是读入,得循环开辟缓存区,
sharp0309 2010-03-24
  • 打赏
  • 举报
回复
还有没有更好的方法啊!!!!!!!
jason176374 2010-03-24
  • 打赏
  • 举报
回复
这个问题关键不在算法而在于性能。
chen_wenyue 2010-03-24
  • 打赏
  • 举报
回复
另外补充下,考虑到你记录较多,为了避免磁盘操作,你应该开一个缓冲区,将要处理的数据从文件读到内存中,再进行比较。无论文件的大小,大的话就分段读取。小的话,就一次性读到内存里。
chen_wenyue 2010-03-24
  • 打赏
  • 举报
回复
主要是你要确认你说的“重复行都在一起”都在一起,哈哈。。。那么我上面的实现应该就是对的。
chen_wenyue 2010-03-24
  • 打赏
  • 举报
回复
这个很简单啊,不明白你提这个问题是想得到什么?代码?思路?
你设两个变量,一个存当前行,一个存上一行,再设两个变量进行累加,一个是上个重复串的次数,一个是当前串的重复次数,然后在串改变时,进行比较,如果当前大,就更新。唯一注意的就是,如果文件较大,需要开个缓冲区进行分段读取,在缓冲区更新时特别处理一下,有可能要回退读取。伪代码如下:
CString strOldString,strNewString,strResult;
long nRepeat = 1;
long nCnt = 0;
strOldString = GetLines();
while(!IsEof)
{
strNewString = GetLines();
if( strOldString == strNewString )
{
nRepeat++;
strOldString = strNewString;
}
else
{
if( nRepeat>nCnt )
{
nCnt = nRepeat;
strResult = strOldString;
}
strOldString == strNeaString;
nRepeat = 1;
}
}

printf("string = %s,nCnt = %d\n", strResult, nCnt);
SullenSun 2010-03-24
  • 打赏
  • 举报
回复
算法问题啊,搞不好就很慢。。
tanwei1002 2010-03-24
  • 打赏
  • 举报
回复
遍历文件所有记录 获取记录和出现的次数
踏实每一步 2010-03-24
  • 打赏
  • 举报
回复
mark下
jingzhongrong 2010-03-24
  • 打赏
  • 举报
回复
用hashtable记录输出和出现次数。
zxdyu2009 2010-03-24
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 chen_wenyue 的回复:]

这个很简单啊,不明白你提这个问题是想得到什么?代码?思路?
你设两个变量,一个存当前行,一个存上一行,再设两个变量进行累加,一个是上个重复串的次数,一个是当前串的重复次数,然后在串改变时,进行比较,如果当前大,就更新。唯一注意的就是,如果文件较大,需要开个缓冲区进行分段读取,在缓冲区更新时特别处理一下,有可能要回退读取。伪代码如下:
CString strOldString,strNewSt……
[/Quote]
可以。
chen_wenyue 2010-03-24
  • 打赏
  • 举报
回复
整个问题的优化只能是在扫描字符上面做文章,减少扫描字符的次数,除了读文件数据到内存中不算外,能减少对数据的扫描就是优化的算法,我第二种思路就是通过串长度,在不同串时,忽略掉第一个字符串的扫描,这样只是在你文件中,单独的字符串较多时会有较大性能提升,你先分析下你文件中的数据,再想更好的优化算法
chen_wenyue 2010-03-24
  • 打赏
  • 举报
回复
[Quote=引用 19 楼 vc_zsy 的回复:]
内存映射文件来打开文件
创建一个map<cstring,int>对象
读取文件并更新map数据
读取完毕基本上已经出结果了
[/Quote]
呵呵。。。这样会很慢。STL库里面的对象和算法为了通用,效率都是较低的。
我的方向应该是对的,只是在字符串比较算法上可以再下下功夫。

另外楼主,俺做为一个新人,赚你40不容易啊,快给分吧,哈哈。。。。。
VC_ZSY 2010-03-24
  • 打赏
  • 举报
回复
内存映射文件来打开文件
创建一个map<cstring,int>对象
读取文件并更新map数据
读取完毕基本上已经出结果了
chen_wenyue 2010-03-24
  • 打赏
  • 举报
回复
字符串比较速度越快,你的缓冲区就可以开的越大,读盘次数就越少,相应的处理速度就越快,哈哈。。一个原则就是保证读入一片缓冲区的时间跟处理的时间相当就是最优的。缓冲区大小就只能在你的机器上通过多次试验找到一个较好的值。
chen_wenyue 2010-03-24
  • 打赏
  • 举报
回复
呵呵。。再补充一句,我上面说的还是有点片面,有一个方面可以优化,就是字符串比较上。。。。如果你不采用已有的接口进行比较,自己写一个比较函数,可以优化处理速度。。。比如通常的字符串比较为了通用,是按两个字串进行逐字符比较大小的,但针对你的问题,你可以专门写个字符串比较函数。
我的一个思路就是采用多线程分块比较,每个线程在处理自已的数据块时,可以按长度先进行过滤,比如第一个字符串长度为5,就比较10这个位置上的字符串是否为换行符,如果是再比较两个串,不是就忽略掉前5个字符,从6开始查找换行符。哈哈。。。这样会加块比较算法的速度,当然这方面优化的空间比较大,哪位高手再想想更优的算法。
lixung 2010-03-24
  • 打赏
  • 举报
回复
内存映射
chen_wenyue 2010-03-24
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 sharp0309 的回复:]
引用 6 楼 chen_wenyue 的回复:
主要是你要确认你说的“重复行都在一起”都在一起,哈哈。。。那么我上面的实现应该就是对的。

你打方法确实可行 不过性能就不能保证了,我的txt文件有600M 如果照你说的写入内存 那也是不可行的啊
[/Quote]
呵呵。。。我上面说了,如果文件大,就两个办法,一个是要建个缓冲区,分段读取,缓冲区不要太小,太小没意义。第二个就是对文件进行物理分割。第三个就是做内存映射文件。

至于处理算法上,如果说到慢,是没办法的,你数据量有那么多,虽然这个方法看上去好象低效,但其实不然,因为无论你采用什么算法,你都要至少遍历一遍所有的字符串,没有取巧的地方。这个简单算法保证了只遍历一次。另外也不要在线程上做文章了,只要你缓冲区大小合理,一个线程处理决不会慢过多线程,因为在处理算法上不存在可以分解的多个任务相协作,唯一觉得可以用到多线程就是读磁盘数据到缓冲区,最好缓冲区大小能设在读取时间与处理时间基本相当,这样可以一个线程读文件到缓冲区,一个线程进行数据处理。

至于性能,建议你试下,应该不会太慢,600M并不是很大,呵呵。。。。。计算机本来就是干这些事的。
加载更多回复(2)

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧