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

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


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


数据量小的时候没有问题,数据一大就碰到这个问题了
zhuzhuor
2012-04-13 15:31:12 +08:00
@onesuper 汗,那就不清楚了。推荐你换pypy做interpreter试试看是不是还有问题,另外运行速度也应该能提高一些
onesuper
2012-04-13 19:10:30 +08:00
@zhuzhuor 有空去试试,谢指点
likuku
2012-04-13 19:13:06 +08:00
以前也做过类似的,貌似没碰到这问题。不知道你的输出到文件那段是怎么写的?另外,运行平台是什么OS,什么FileSystem?
gujiaxi
2012-04-13 19:31:06 +08:00
程序卖萌……
onesuper
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
2012-04-13 20:02:48 +08:00
@gujiaxi 萌死人不偿命阿
likuku
2012-04-13 21:20:42 +08:00
@onesuper 您跑这个py的机器在运行时有足够的内存(大于1.2G文件大小)分给python么?

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

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

./xxx.py >outFileName
silverbullettt
2012-04-26 23:45:43 +08:00
我是来顶LZ的……文件对象close了吗?

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/32087

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX