【发布时间】:2013-12-05 08:22:22
【问题描述】:
完整的工作测试用例
当然,根据您在本地和远程计算机上的内存,您的数组大小会有所不同。
z1 = numpy.random.rand(300000000,2);
for i in range(1000):
print('*******************************************\n');
direct_output = subprocess.check_output('ssh blah@blah "ls /"', shell=True);
direct_output = 'a'*1200000;
a2 = direct_output*10;
print(len(direct_output));
当前用例
如果它有助于我的用例如下:
我发出数据库查询然后将结果表存储在远程机器上。然后我想通过网络传输它们并进行分析。到目前为止,我一直在 python 中执行以下操作:
#run a bunch of queries before hand with the results in remote files
....
counter = 0
mergedDataFrame = None
while NotDone:
output = subprocess.check_output('ssh blah@blah cat /data/file%08d'%(counter))
data = pandas.read_csv(...)
#do lots of analysis, append, merge, numpy stuff etc...
mergedDataFrame = pandas.merge(...)
counter += 1
在某些时候,我在 check_output 命令中收到以下错误:[Errno 12] 无法分配内存
背景
感谢以下问题,我想我知道出了什么问题。发布了许多解决方案,我正在尝试确定哪些解决方案可以避免 [Errno 12] Cannot allocate memory 与使用 fork/clone 的子进程实现相关的错误。
Python subprocess.Popen "OSError: [Errno 12] Cannot allocate memory" 这给出了基本诊断并提出了一些解决方法,例如生成单独的脚本等...
Understanding Python fork and memory allocation errors 建议使用 rfoo 来规避 fork/clone 的子进程限制以及产生子进程和复制内存等...这似乎暗示了客户端-服务器模型
What is the simplest way to SSH using Python? ,但是由于内存限制和 fork/clone 实现,我有无法使用子进程的额外限制?解决方案建议使用 paramiko 或基于它构建的东西,其他人建议使用 subprocess(我发现这在我的情况下不起作用)。
还有其他类似的问题,但答案经常谈到文件描述符是罪魁祸首(在这种情况下他们不是),向系统添加更多 RAM(我不能这样做),升级到 x64(我已经在 x64 )。一些暗示 ENOMEM 的问题。一些答案提到尝试确定 subprocess.Popen(在我的情况下为 check_output)是否没有正确清理进程,但看起来 S. Lott 和其他人同意子进程代码本身正在正确清理。
- Python memory allocation error using subprocess.Popen
- Python IOError cannot allocate memory although there is plenty
- Cannot allocate memory on Popen commands
- Python subprocess.Popen erroring with OSError: [Errno 12] Cannot allocate memory after period of time
我在 github https://github.com/paramiko/paramiko/search?q=Popen&type=Code 上搜索了源代码,它似乎在 proxy.py 文件中使用了 subprocess。
实际问题
这是否意味着最终 paramiko 正在使用上述 Popen 解决方案,当 python 内存占用增加并且由于克隆/分叉实现而进行重复的 Popen 调用时会出现问题?
如果 paramiko 不起作用,是否有另一种方法可以通过仅客户端解决方案来做我正在寻找的事情?还是需要客户端/服务器/套接字解决方案?如果是这样,rfoo、tornado 或 zeromq、http 传输中的任何一个都可以在这里工作吗?
注意事项 我正在运行 64 位 linux 8GB 主内存。我不想追求购买更多 RAM 的选择。
【问题讨论】:
-
1.我可以使用simpler example 重现该问题。 (64bit linux) 2. 通常我希望
paramiko使用套接字来创建连接。 -
我确实看到了那个链接,谢谢。他们似乎主要建议 paramiko。 Paramiko(通过套接字)应该解决子进程模块 fork/clone 问题是否正确?我对 paramiko 的主要担忧(可能是错误的)是我进行了快速的源代码搜索,发现它使用了 subprocess 模块——尽管我不知道是为了什么,也不知道在多大程度上。
-
Paramiko 是一个原生的 python ssh 实现。它不为传输的任何部分使用子进程。
标签: python networking memory subprocess paramiko