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 · 4036 次点击
    这是一个创建于 4394 天前的主题,其中的信息可能已经有所发展或是发生改变。
    程序是将一个文件中的内容读到内存(大概占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   ·   我们的愿景   ·   实用小工具   ·   5336 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 32ms · UTC 07:26 · PVG 15:26 · LAX 00:26 · JFK 03:26
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.