为什么numpy不是立即保存,可以强制它立即保存吗?

  • 本文关键字:保存 numpy numpy save
  • 更新时间 :
  • 英文 :


我以为这个问题已经被问过了,但是我找不到它,所以这里是:我已经注意到numpy。保存命令只会触发,也就是说,要创建的文件实际上是在整个代码完成运行之后创建的。当代码需要数天或数周才能运行时,这是很糟糕的,并且我想确切地确定是哪个函数以及函数中的哪些参数导致了瓶颈。

print()命令也有类似的问题;它不会立即写入输出文件,而是等到整个代码完成后再写入。我可以使用以下代码强制它立即写入:

def printnow(*messages):
w=open("output.log","a")
for message in messages:
w.write(str(message))
w.write(" ")
w.write("n")
w.close()

我想知道是否有可能做一个类似的事情,即强制立即保存,为numpy数组。无需追加;用numpy数组的当前值覆盖是可以的。

如果有区别的话,我不是在我的个人电脑上运行代码,而是在一个组服务器上运行,我使用Putty和WinSCP向它发出命令并检查。

感谢编辑:我尝试了另一个软件包shelve,它遇到了同样的问题。我创建一个名为function_calls的全局变量,并将其初始化为0。然后,在我怀疑导致瓶颈的函数的开头,我输入以下代码:
global function_calls
file='function_inputs'+str(function_calls)
function_shelf=shelve.open(file,'n')
for key in dir():
function_shelf[key]=locals()[key]
function_calls+=1

这段代码旨在创建一个新文件,在每次调用函数时保存函数输入。不幸的是,运行了9个小时后,还没有创建任何文件。所以我怀疑Python只是在等待整个运行结束后才创建我要求它创建的文件。

这可能是Python写文件时常见问题的一个实例:除非您立即关闭它们,否则它们可能不会被刷新和关闭,直到进程退出,或者文件引用被垃圾收集。

一个常见的原因是进程以非计划的方式关闭(解释器或库崩溃)。

当将文件名称传递给API调用时,这很难防止。许多api允许传入一个文件对象,这允许用户更严格地管理它。一个例子:

import os
import numpy as np
# Make some data
a = np.random.random((100,100))
# Open the output file in a context manager
with open("test.npy","wb") as outf:
np.save(outf, a)
# We've already flushed and closed the file
# Reopen, load, and prove it succeeded
with open("test.npy","rb") as inf:
b = np.load(inf)
difference = abs(a-b).sum()
os.unlink("test.npy")
assert difference == 0.0, "Usually a lossless serialization"
print("Ok!")

这是我在别人的代码使用np。当保存图像(我有伤疤)时,可以在PIL中发生。

最新更新