我正在尝试将价值44 mb的数据加载到Pandas数据帧中。这是代码:
import pandas as pd
from sqlalchemy import create_engine
import cx_Oracle
import sqlalchemy
engineor = create_engine('oracle+cx_oracle://xxxxx:xxx@xxx:1521/?service_name=XXX')
sql = "select * from accounts where date >= '10-MAY-18 06.00.16.170000000 PM'"
do = pd.read_sql(sql, engineor)
do.info(memory_usage='deep')
上面的查询返回约70k行,大小约为44 mb。
当我从Anaconda的本地计算机(Win 7)运行此程序时,数据会在一两分钟内加载到数据帧中而不会出现任何问题。但是,当我在Docker容器(基于Linux)中运行相同的东西时,它只是挂起。
我验证了docker容器具有足够的内存,并且内存不会随着时间的推移而增长(尽管大小很小,约为44 mb)。它只是被提交并无限期挂起,我无法通过按Control + C或Control + Z来杀死它。我需要断开与计算机的连接并重新登录。
我试图匹配在本地计算机上运行的Anaconda中的Pandas版本。但这并没有太大帮助,它仍然挂着。现在,我的本地计算机和Python版本之间唯一的区别是。在docker容器中为3.5.3,在我的本地版本中为3.6.3,Anaconda从Windows运行,而docker容器基于Linux。我不确定这些东西是否有作用。
关于如何克服这一点的任何建议?
答案 0 :(得分:0)
我刚遇到和你一样的问题。我认为这是因为在桥接网络容器内使用了套接字通信。
Docker 默认使用桥接网络,只需指定端口就可以转发到主机。当您使用容器作为服务器时,这通常有效。但是当您的容器作为客户端运行并创建用于通信的套接字时,就会出现问题。
客户端需要向服务器开放随机端口并将它们与套接字绑定。由于只能转发选定的端口,因此无法在外部找到那些随机端口。接收数据将永远找不到客户端容器,容器内的套接字将永远挂起。
我的解决方案是使用主机网络运行容器。您可以使用像
这样的命令运行容器docker run --rm -d --network host --name my_nginx nginx
或使用 docker-compose
version: '3.7'
services:
my_nginx:
...
network_mode: "host"
但注意使用主机网络可能会导致端口冲突。
附注。虽然使用主机网络解决了我的问题,但我不是套接字或网络方面的专家。如果我对机械装置有错误,请纠正我。我在这篇文章中阅读了套接字:https://docs.oracle.com/javase/tutorial/networking/sockets/definition.html。