Chinaunix
标题:
awk如何能处理1.5G和16G的大文件,读取时出现内存错误
[打印本页]
作者:
x-dongzi
时间:
2012-10-15 14:24
标题:
awk如何能处理1.5G和16G的大文件,读取时出现内存错误
我手头有两个文本文件,一个1.5G左右,一个16G左右,
1.5G文件的例子:
1234235963745
asdfasfsadfasds
1111111111111
复制代码
16G文件的例子如下:
1234235963745,1234
asdfasfsadfasds,4124
1111111111111,m123
1234235233745,1111
asdfas33dfasds,111231
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
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
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