Chinaunix

标题: awk如何能处理1.5G和16G的大文件,读取时出现内存错误 [打印本页]

作者: x-dongzi    时间: 2012-10-15 14:24
标题: awk如何能处理1.5G和16G的大文件,读取时出现内存错误
我手头有两个文本文件,一个1.5G左右,一个16G左右,
1.5G文件的例子:
  1. 1234235963745
  2. asdfasfsadfasds
  3. 1111111111111
复制代码
16G文件的例子如下:
  1. 1234235963745,1234
  2. asdfasfsadfasds,4124
  3. 1111111111111,m123
  4. 1234235233745,1111
  5. asdfas33dfasds,111231
  6. 1111232111111,1231
复制代码
我是在16G文件中,找出其第一列与1.5G文件中相同的行,然后输出。
我的思路是将1.5G的文件读入awk中,然后再读第二个16G的文件,匹配到后就输出,可是现在发现awk在内容占用到2G多的时候就因为内存的原因报错了,当时已经读入了2亿6千万多行的数据,可是1.5G的文件的总行数大概在5亿多行。
想请教一下大家看看谁知道对于这种大文件有什么办法处理吗?

PS:在将1.5G的文件分割成小文件的方法我已经试了,是可以的,就是想问还有没有更好的处理办法。
PPS:不只局限于shell,别的什么语言程序都可以,只要能处理就可以,谢谢大家了。~~
作者: dahaoshanhe    时间: 2012-10-15 14:29
本帖最后由 dahaoshanhe 于 2012-10-15 14:30 编辑

把文件分割成一些小的呢
或是找台大内存的机器
作者: x-dongzi    时间: 2012-10-15 14:46
回复 2# dahaoshanhe




分割的已经试过了,可以用。
内存的话,机器本身已经很大了,16G,就是awk自己用不了那么多。系统是32位的,不知道64位的会不会好点,但是手头没有64位的机器,也试不了。

作者: lcz88990200    时间: 2012-10-15 14:47
linux 32位的操作系统只支持最大文件2G
若需处理更大的文件,要安装64位的操作系统
作者: jason680    时间: 2012-10-15 15:24
回复 1# x-dongzi

does it have issue as below command:

awk '{a[$0]=1}' 1.5G.txt

   
作者: dn833    时间: 2012-10-15 15:25
  1. grep -Ff 1.5G 16G
复制代码
这样试试看吧
作者: x-dongzi    时间: 2012-10-15 15:50
回复 4# lcz88990200


等我找台64位的AIX机器试试看。
作者: x-dongzi    时间: 2012-10-15 15:51
回复 5# jason680


    不行的,总是内存用到2094912k之后awk就hang在那里了。
作者: lcz88990200    时间: 2012-10-15 16:04
每天我要用C程序处理一批文件分析提取数据,每个文件有2-6G,
在linux 32位下<2G都能正常处理,超过2G全都处理不了,
没办法,只好安装64位系统,C程序不作任何改动,重新编译一下就能处理任意大小文件。
我安装64位系统的主机内存2G。
听我的没错的。
作者: x-dongzi    时间: 2012-10-15 16:07
回复 9# lcz88990200


    谢谢,悲催了,木有64位的机器,等以后找找吧。不过现在倒是已经分割成小文件处理了。唉~~~~
作者: jason680    时间: 2012-10-15 18:22
回复 1# x-dongzi


How about perl code as below:
Note: you can rename 1.5G_file.txt and 16G_file.txt on your system

$ cat 1.5G_file.txt
xxxxxx00
xxxxxx01
xxxxxx02

$ cat 16G_file.txt
xxxxxx00,00
xxxxxx02,02
xxxxxx08,08
xxxxxx09,09

$ perl -F, -lane '{$c++ if($ARGV!=$v);$v=$ARGV;if($c==1){$h{$F[0]}=1;next}if($h{$F[0]}==1){print $_}}' 1.5G_file.txt 16G_file.txt
xxxxxx00,00
xxxxxx02,02
   
作者: aichinaunix    时间: 2012-10-16 10:25
把两个文件导入到数据库里,一个文件一张表,用自己的pc机就可以搞定
在数据库里操作,就没有限制了
作者: purpose_cu    时间: 2012-10-16 11:25
自己写hash算法,小表做个hash表,大表每条值计算hash到hash表中查找,   这就是数据库中的hash join方式。
作者: mihello    时间: 2012-10-16 14:32
本帖最后由 mihello 于 2012-10-16 14:35 编辑
dn833 发表于 2012-10-15 15:25
  1. grep -Ff 1.5G 16G
复制代码
这样试试看吧

这个可以用,应该算是最简单的方式。
作者: 张不凡    时间: 2012-10-22 16:22
回复 14# mihello

和楼主的要求好像不大一样啊。


   
作者: rdcwayx    时间: 2012-10-23 07:36
楼主的awk 是什么版本啊?

老版本的awk 有类似的内存问题,楼主装个gawk 4试一下。
作者: blackold    时间: 2012-10-23 09:51
awk使用的内存最大值是可以设置的吧。




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2