在线咨询
eetop公众号 创芯大讲堂 创芯人才网
切换到宽版

EETOP 创芯网论坛 (原名:电子顶级开发网)

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
查看: 7287|回复: 6

[求助] 使用TCL文件处理二进制数据问题

[复制链接]
发表于 2013-2-17 11:23:03 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?注册

x
我使用TCL来读取一个文件里的数据,该文件里存放的都是二进制数据,每个数据都是32bit,这个文件大小大概50M字节(Windows系统),所以一共大概包含有800万个这样的32bit的数据。
我TCL代码要做的事情是每次读取一个32bit的数据分析后,在一个画布上画出一个点,最后将所有数据读出点阵在画布上,现在的问题是运行TCL代码后电脑死机状,查看window任务管理发现这个进程占据了大部分内存,分析是tcl代码从文件读来数据全部临时存在内存里了,无法释放。修改代码只读10万个数据结果能很快出来。下面截取一段关键代码:




  1. ;###下述代码读取二进制文件,获取PPU参数
  2. set cnt 0
  3. ;##set chan [open "bin_lg5mm.txt" r]
  4. set chan [open "lg5mm.dat" r]
  5. fconfigure $chan -translation binary
  6. while {1} {
  7.        set data_read [read $chan 4];##一次读4个字节,即32bit,在循环体中,该命令似乎可以自动连续往后读。
  8.        binary scan $data_read "H*" tmp0;##将这4个字节转换成16进制数据
  9.       
  10.        set m_val [get_m $tmp0]
  11.        set x_val [get_x $tmp0]
  12.        set y_val [get_y $tmp0]
  13.        pain_cross_star $m_val $x_val $y_val
  14.        ;##flush $chan           

  15.        ;##if {[eof $chan]} {;###判断是否到文件末尾,由于lg5mm.dat文件太大,写入文本文件时间长,有时会导致内存不足。
  16.        ;##     break
  17.        ;##}
  18.        ;###下列代码是部分转换
  19.        incr cnt
  20.        if {$cnt > 10000} {
  21.            close $chan
  22.            break           
  23.        }
  24.       
  25. }


复制代码
发表于 2013-2-27 15:12:46 | 显示全部楼层
;##flush $chan
tcl应该默认会自动刷新输出刷新缓冲区吧,这句话应该不需要。
if {$cnt > 10000} {

           close $chan

           break           

       }

另外你把这把数字改成8000000,看运行卡不卡。
 楼主| 发表于 2013-2-27 15:19:54 | 显示全部楼层



flush这句本身我加上和没加上没有区别的;10W个都很吃力了,改成800W基本等于死机!
发表于 2013-2-28 09:35:27 | 显示全部楼层
以前我在linux下面处理过几十MB大小的数据文件,我是一行一行处理的,运行时等的时间稍微久了点(可能一两分钟),但也能运行。不知道你的问题在哪里。
顺便问一下:
set data_read [read $chan 4];##一次读4个字节,即32bit。
这句话是每次读4个字符吧,4个字节是什么意思?4个byte?
 楼主| 发表于 2013-2-28 11:14:09 | 显示全部楼层


以前我在linux下面处理过几十MB大小的数据文件,我是一行一行处理的,运行时等的时间稍微久了点(可能一两分 ...
jackiexiuyi 发表于 2013-2-28 09:35


1、我这个数据文件也有近50M左右;
2、文件的格式是纯二进制,数据有800W组,每一组32bit,所以读的时候是一组一组读出分析处理
3、tcl处理是基于字符,而我的文件是二进制,所以先要进行转换的
4、如果我只读10W组的时候,等的时间也很长,但是至少能出来结果;800w也许也能出结果,但是电脑基本处于停滞状态,内存全被占用
发表于 2013-2-28 17:05:29 | 显示全部楼层
"我TCL代码要做的事情是每次读取一个32bit的数据分析后,在一个画布上画出一个点,最后将所有数据读出点阵在画布上,"
  你现在run的代码是只有读取一个32bit的数据分析,还是也包括后面的画图的过程?
  不确定你是卡在哪一步?
 楼主| 发表于 2013-3-1 10:39:51 | 显示全部楼层


"我TCL代码要做的事情是每次读取一个32bit的数据分析后,在一个画布上画出一个点,最后将所有数据读出点阵在 ...
jackiexiuyi 发表于 2013-2-28 17:05




我贴出来的代码基本包含了完整的源文件,其实代码很短。
第一步:从二进制文件读出1个32bit的数据
第二步:从这个32bit数据中取出各个参数(M,X,Y),其实就是X和Y的坐标值,分别在这个32bit的不同位置,类似FPGA里的位操作
第三步:获得相应参数后调用画图子函数。
下面的代码就是分别调用几个子函数,在我贴出的代码里有
  • set m_val [get_m $tmp0]
  •        set x_val [get_x $tmp0]
  •        set y_val [get_y $tmp0]
  •        pain_cross_star $m_val $x_val $y_val
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐 上一条 /2 下一条


小黑屋| 手机版| 关于我们| 联系我们| 在线咨询| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2024-12-18 21:09 , Processed in 0.019973 second(s), 7 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
快速回复 返回顶部 返回列表