程序明明已经执行到最后一行,但是一直不返回terminal。system monitor里看到python解释器进程的状态是uninteruptable - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Distributions
Ubuntu
Fedora
CentOS
中文资源站
网易开源镜像站
onesuper
V2EX    Linux

程序明明已经执行到最后一行,但是一直不返回terminal。system monitor里看到python解释器进程的状态是uninteruptable

  •  
  •   onesuper
    onesuper 2012-04-12 21:00:50 +08:00 4510 次点击
    这是一个创建于 4934 天前的主题,其中的信息可能已经有所发展或是发生改变。
    程序是将一个文件中的内容读到内存(大概占1.2GB)转换格式,然后写到另一个文件中
    16 条回复    1970-01-01 08:00:00 +08:00
    onesuper
        1
    onesuper  
    OP
       2012-04-12 21:21:16 +08:00
    请问有人碰到过这种情况么?
    zhuzhuor
        2
    zhuzhuor  
       2012-04-12 21:54:27 +08:00 via iPad
    文件io有缓存的,猜测可能虽然运行到最后一行了,但是后台还没把1g多的文件全写到硬盘里呢
    onesuper
        3
    onesuper  
    OP
       2012-04-13 10:10:45 +08:00
    @zhuzhuor 恩,比如我在一个while循环中不断调用write,这期间都不会发生IO,直到我调用了close()以后才会把内存中的文件写到硬盘上,是这个意思么?
    zhuzhuor
        4
    zhuzhuor  
       2012-04-13 10:19:10 +08:00
    @onesuper 嗯 应该是。你程序退出的时候系统也会把缓冲里面的数据全都保存下来,我猜测程序虽然看似运行到最后一行,但是数据还没全保存好呢
    你查查文件io有没有flush函数,写一点然后flush一下看看程序是怎么运行的(虽然这样会造成程序效率比较低)
    onesuper
        5
    onesuper  
    OP
       2012-04-13 15:04:35 +08:00
    @zhuzhuor 但是我发现其实那个文件已经已经写完了,但是python解释器还是陷入了无止境(感觉上)的等待


    现在我让while每循环10000次就flush一下,然后文件开始慢慢地变大,结果发现等文件全部写完、程序执行到最后一行还是死了


    数据量小的时候没有问题,数据一大就碰到这个问题了
    zhuzhuor
        6
    zhuzhuor  
       2012-04-13 15:31:12 +08:00
    @onesuper 汗,那就不清楚了。推荐你换pypy做interpreter试试看是不是还有问题,另外运行速度也应该能提高一些
    onesuper
        7
    onesuper  
    OP
       2012-04-13 19:10:30 +08:00
    @zhuzhuor 有空去试试,谢指点
    likuku
        8
    likuku  
       2012-04-13 19:13:06 +08:00 via iPhone
    以前也做过类似的,貌似没碰到这问题。不知道你的输出到文件那段是怎么写的?另外,运行平台是什么OS,什么FileSystem?
    gujiaxi
        9
    gujiaxi  
       2012-04-13 19:31:06 +08:00
    程序卖萌……
    onesuper
        10
    onesuper  
    OP
       2012-04-13 19:33:50 +08:00
    @likuku OS=debian FS=ext3

    i = 0
    while i < len(start):
    outfile.write(str(start[i]) + '\t')
    outfile.write(str(width[i]) + '\n')
    i += 1

    start有60M个数据。刚刚吃个饭回来发现还是没有返回,但文件确实已经写好了。
    onesuper
        11
    onesuper  
    OP
       2012-04-13 20:02:48 +08:00
    @gujiaxi 萌死人不偿命阿
    likuku
        12
    likuku  
       2012-04-13 21:20:42 +08:00
    @onesuper 您跑这个py的机器在运行时有足够的内存(大于1.2G文件大小)分给python么?

    另外,你这文件不可以分行执行么?只能一次搞完?
    onesuper
        13
    onesuper  
    OP
       2012-04-14 12:38:49 +08:00
    @likuku 我想尽快能用上转好了的格式,所以就用python写了个脚本,没有考虑效率问题(占内存小的方法一定是有的),没想到出了这个茬子,觉得挺奇怪的就上来问问

    刚刚看了一下,python占内存最高的时候是3G/4G。。。难道这个问题是因为swap in/out 导致的么?
    likuku
        14
    likuku  
       2012-04-14 14:02:54 +08:00 via iPhone
    @onesuper 假若swap都开始用了,不慢才怪呢
    likuku
        15
    likuku  
       2012-04-14 14:06:41 +08:00 via iPhone
    @onesuper 假若输出结果是文本流,何不直接print()到显示器,用os的输出重定向到文件了事,把写入文件的事全交给os。

    ./xxx.py >outFileName
    silverbullettt
        16
    silverbullettt  
       2012-04-26 23:45:43 +08:00
    我是来顶LZ的……文件对象close了吗?
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     4165 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 49ms UTC 00:15 PVG 08:15 LAX 17:15 JFK 20:15
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86