netcrsky 发表于 2015-01-03 13:13

Python 处理5-12G左右的TXT文本

5-12G左右。如果处理这么大的txt文本比如去重操作,需要怎么操作?

lolizeppelin 发表于 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 == "-- Current Database: `mysql`":
                print 'fine mysql len is ' + str(count_len)
                start_len = count_len
            #获取创建mysql数据库的结束位置
            if line == "-- 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 == "-- Current Database: `mysql`":
                #创建位置标记
                mark_start = mark
            if line == "-- 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 = '/*\n'
      #用@填充
      for k in range(mark_start+3, mark_end):
            map = '@'
      #尾3字节添加注释符号
      map[-3:mark_end] = '*/\n'
      map.flush()
      f.close()

twz915 发表于 2015-01-05 15:00

我最近也遇到这样的问题,后来有了超算,512G内存,直接读入,set 去重了,省内存的方法太慢,有好方法请告知
页: [1]
查看完整版本: Python 处理5-12G左右的TXT文本