免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2309 | 回复: 2
打印 上一主题 下一主题

Python 处理5-12G左右的TXT文本 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2015-01-03 13:13 |只看该作者 |倒序浏览
5-12G左右。如果处理这么大的txt文本比如去重操作,需要怎么操作?

论坛徽章:
2
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:57:09
2 [报告]
发表于 2015-01-03 19:37 |只看该作者
本帖最后由 lolizeppelin 于 2015-01-03 19:46 编辑

read文件定位需要修改的开始位置和结束位置
nmpa映射文件需要修改的部分
改完写回去


以前写过一个

        f = open(full_file_path,'r+')
        count_len = 0
        start_len = 0
        end_len = 0
        for i in range(max_serach_num):
            line = f.readline()
            count_len += len(line)
            #获取创建mysql数据库的起始位置
            if line[0:28] == "-- Current Database: `mysql`":
                print 'fine mysql len is ' + str(count_len)
                start_len = count_len
            #获取创建mysql数据库的结束位置
            if line[0:40] == "-- Dumping routines for database 'mysql'":
                end_len = count_len
                break
            if i == max_serach_num - 1:
                return_value['code'] = 1
                return_value['reason'] = 'find mysql databse start or end line fail over max'
                return return_value
        if not end_len > start_len:
                return_value['code'] = 1
                return_value['reason'] = 'find mysql databse start or end line fail'
                return return_value

        #偏移量必须是pagesize的整数倍,补全下偏移量
        completion_pagesize = start_len % page_size
        print 'cp size is %d ' % completion_pagesize
        start_len = start_len - completion_pagesize
        mmap_len = end_len - start_len
        #映射数据库文件 创建mysql的文件断
        map = mmap.mmap(f.fileno(), length=mmap_len, access = mmap.ACCESS_WRITE, offset=start_len)

        mark_start = 0
        mark_end = 0
        for i in range(max_mysqldb_len):
            mark = map.tell()
            line = map.readline()
            print line
            if line[0:28] == "-- Current Database: `mysql`":
                #创建位置标记
                mark_start = mark
            if line[0:40] == "-- Dumping routines for database 'mysql'":
                #结束位置标记
                mark_end = map.tell()
                break
            if i == max_mysqldb_len - 1 :
                return_value['code'] = 1
                return_value['reason'] = 'mysql database too large!'

        #头3字节转为注释符号
        map[mark_start:mark_start+3] = '/*\n'
        #用@填充
        for k in range(mark_start+3, mark_end):
            map[k] = '@'
        #尾3字节添加注释符号
        map[-3:mark_end] = '*/\n'
        map.flush()
        f.close()

论坛徽章:
0
3 [报告]
发表于 2015-01-05 15:00 |只看该作者
我最近也遇到这样的问题,后来有了超算,512G内存,直接读入,set 去重了,省内存的方法太慢,有好方法请告知
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP