免费注册 查看新帖 |

Chinaunix

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

求助,unpack后为什么长度增大?多谢了 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-06-12 06:53 |只看该作者 |倒序浏览
有一个二进制文件,
我用下面的代码读入数组:
for ($i=1;$i<$file;$i++)
        {
               
                read k_mer,$temp,1;
                $kmer[$i]=unpack C,$temp;
                }

可实际运行后,总是狂吃内存,直到用掉内存数是文件长度的三四倍仍然没有读完的迹象。
我是新手,请各位指点,这是什么问题?是不是我读取的方式有误?应该如何解决?多谢

论坛徽章:
0
2 [报告]
发表于 2006-06-12 08:17 |只看该作者
三四倍是很正常的。
你用一个数组元素储存一个字节的数据,
而一个数组元素占用的空间至少要大于一个标量占用的空间,
撇开数组自身维护元素时需要的空间不说,单单就是标量占用的空间也是很惊人的,
Perl 中的一个标量所占用的至少在 12 字节以上,
因此你这种方法处理 100M 的文件就得 1G 的内存,
肯定是不可取的。

论坛徽章:
0
3 [报告]
发表于 2006-06-12 08:40 |只看该作者

回复 2楼 莫愁 的帖子

原来如此,多谢了
那么有没有什么好办法来处理这种文件?
实现的效果就是把文件中每一个字节unpack后读入内存
多谢

论坛徽章:
0
4 [报告]
发表于 2006-06-12 08:41 |只看该作者
原帖由 geshutian 于 2006-6-12 08:40 发表
原来如此,多谢了
那么有没有什么好办法来处理这种文件?
实现的效果就是把文件中每一个字节unpack后读入内存
多谢

相信存入内存只是过程,而不是你的目的。
为何不把你真正的目的说出来呢?

论坛徽章:
0
5 [报告]
发表于 2006-06-12 08:51 |只看该作者
原帖由 莫愁 于 2006-6-12 08:41 发表

相信存入内存只是过程,而不是你的目的。
为何不把你真正的目的说出来呢?



呵呵,我比较笨,怕表达不清楚

程序是要用来统计一些数据
这个文件中每一个字节存储的都是某一数据的特征值

之后对哪些数据进行操作是随机的
而且操作次数很多
所以我想能够一次都读入内存的话能够迅速根据下标检索到相应的特征值

不知道说清楚没有
多谢了

论坛徽章:
0
6 [报告]
发表于 2006-06-12 08:57 |只看该作者
原帖由 geshutian 于 2006-6-12 08:51 发表



呵呵,我比较笨,怕表达不清楚

程序是要用来统计一些数据
这个文件中每一个字节存储的都是某一数据的特征值

之后对哪些数据进行操作是随机的
而且操作次数很多
所以我想能够一次都读入内存的话能够 ...

那也不需要存到一个数组里呀,一次性把整个文件读入到一个字符串(如果文件不是很大的话),
然后需要的时候用 substr 取,也很方便呀。为什么要切割成数组让空间扩大十几倍呢?

  1. open FH, "<文件名" or die "open";
  2. my $content;
  3. {local $/; $content=<FH>}
  4. # 下面再用 substr 取 $content 中的数据
复制代码

论坛徽章:
0
7 [报告]
发表于 2006-06-12 09:02 |只看该作者
[quote]原帖由 莫愁 于 2006-6-12 08:57 发表

那也不需要存到一个数组里呀,一次性把整个文件读入到一个字符串(如果文件不是很大的话),
然后需要的时候用 substr 取,也很方便呀。为什么要切割成数组让空间扩大十几倍呢?

了解了,多谢
再问一下,这个 二进制文件 没有影响吧?
读取的时候会不会有问题?

论坛徽章:
0
8 [报告]
发表于 2006-06-12 09:08 |只看该作者
不会有问题。

论坛徽章:
0
9 [报告]
发表于 2006-06-12 09:12 |只看该作者
明白了,我来改写一下,多谢
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP