关于Anaconda与Jupyter的使用笔记

Anaconda 的使用

采用 PYTHON 处理
顺便学习 arcpy

为什么使用

使用 anaconda 的好处之一是可以设置多个 python 环境通过
通过代码

conda activate myenv

激活当前即将使用的 python 环境 myenv

(base) PS C:\Users\Great Athrun> conda activate myenv
(myenv) PS C:\Users\Great Athrun> conda activate myenv
(myenv) PS C:\Users\Great Athrun>

对于arcgis 中的conda,无需conda 命令。在对应文件夹中打开proenv.bat 直接输入conda

#查看环境
(root) C:\software\ArcGIS\Pro\bin\Python\envs\arcgispro-py3>conda env list  
(root) C:\software\ArcGIS\Pro\bin\Python\envs\arcgispro-py3>acitvate envname

上图中,命令行最前面代表所处环境

更新软件源

除了更新国内软件源之外,还需要注意某些软件只在 conda-forge 中存在,清华源等是没有的。添加代码如下

conda config --add channels conda-forge
conda config --add channels defaults
conda config --set channel_priority strict
conda env create -f environment.yml

除了永久配置软件源之外,也可以在命令行中临时指定软件源

pip install -i https://------ packageName

查看环境

conda info -e

查看脚本

conda list

SSLError

  1. 可能是单位的防火墙策略导致。
  2. 我在迁移 anaconda 环境之后才出现的问题,可能是我直接复制了 虚拟环境 的整个目录。而 SSL 模块是和电脑绑定的,导致 SSL 模块差错了,可以尝试重新安装 pip 。

jupyter中使用不同环境

使用 jupyter 切换不同环境(kernel)时,

  1. 首先选择一个环境,建议在 base 环境下,需要先下载 nb_conda
  2. 其次,下载 ipykernel
conda install -n python_env ipykernel

最开始的环境中启用 jupyter notebook

指定路径下打开jupyter

在 shell 中 cd 到想要的路径,使用命令行打开 jupyter notebook

导入py模块

(在使用jupyter中,通过 save as 功能保存成 py 文件的话是错误的,无法导入。
只能通过 download 成 py 文件的方式,并将其放在 jupyter 工作空间)
利用下面的代码,可以在不重启 jupyter 内核 kernel 的情况下,加载刷新 py文件

from imp import reload
reload(pythonDemo)

jupyter中多进程的使用

Python中包括了 multiprocessing、ipyparallel、Threading 三种多进程的包。
其中较多资料的应该是属于 multiprocess 这个包。
但是在 jupyter 中,因为交互式编译器的一些特点,使得难以真正完成多线程或者完成多线程的方式没有这么直接。

目前在jupyter上使用multiprocessing的坑

1.无法在jupyter或其他交互编辑器下使用

将要进行多线程的函数在 jupyter 中调试好了之后。打包成 py 包,采用调用本地py文件的方式执行函数。之所以以 py 文件的方式执行代码,好像是因为 jupyter 无法在母进程下创建子进程?
note: Functionality within this package requires that the __main__module be importable by the children.此软件包中的功能要求__main__模块可由子级导入。)
ps: 为了使用 jupyter的内核 执行我们的函数,需要使用 %run 这个魔法命令来运行文件,而不是使用 !感叹号来执行。)


2.主模块无属性


对于在 jupyter 中使用包含主函数入口的 .py 文件,同时还需要加入一句代码

__spec__ = "ModuleSpec(name='builtins', loader=<class '_frozen_importlib.BuiltinImporter'>)" 

否则会引发报错

AttributeError: module '__main__' has no attribute '__spec__'

PS: 在StackOverflow中,有答案解释使用下面语句会更好

__spec__  = 'none' 

3.错误日志无法正常提示


对于 jupyter 下运行多进程的算法,无论是自己写的代码还是引用三方库的代码,错误都会指向 appleyResult 的 get() 方法上。所以会在pool类中的 get() 中出现各种奇怪的报错。


4.使用进程池返回无对象 none

在使用线程池Pool进行数据处理的时候,我的计算结果只能在每个进程单独打印。
当我尝试通过循环打开每个进程的时候,使用进程池中函数返回的appleyResult对象的get()函数无法得到结果,只能得到none

所以我尝试通过map函数的方式,直接一口气输入所需要的所有进程的参数。再统一得到他们的返回值。(来自官方的用例,其中 process 是函数,chunks 是输入的参数list,get()是所有返回值组成的 list)

	with mp.Pool(4) as pool :
		resultmulti = pool.map_async(process,chunks).get()
		print(resultmulti)

当然如果不是用这种方法的话也可以使用队列和管道 pipe 进行数据的共享和通讯。

ps: map() 方法有些问题就是,会复制子进程内存,同时数据太大会造成线程分配的过程太慢。导致主进程内存过大以及子进程需要等待很久才开始运行。推荐使用 imap\imap_unordered


5.内存爆炸的原因

处理多进程过程中,内存爆炸的原因很多。
除开数据量太大之外,本人遇过了两次内存过大的问题。

1、在使用上述方法执行文件之后,后台会加载一堆进程
通过使用代码

 multiprocessing.freeze_support()

代码的位置需要在 main 入口的下方
例如
在这里插入图片描述
2.主进程复制了所有子进程数据

采用了上述 map() 方法之后,发现有一个进程内存特别大,但是确认过,使用 chunk 方法读取的数据都很小。
通过查阅资料得知,map方法会 复制所有 子进程的数据到自己的内存中。
采用 imap\imap_unordered 方法

imap_reordered()写法

with mp.Pool(20) as pool:
        for i in  pool.imap_unordered(f,chunks):

imap\imap_unordered() 返回的结果是迭代对象,需要使用迭代的方法去获取返回结果。
同时,对比map方法,这两个方法可以在子进程返回结果后就输出结果进行下一步计算或者检验结果。而map方法则需要等待所有结果都计算完成才能进入下一步的处理工作。
ps: imap_unordered() 顾名思义,结果并不一定会按照输入顺序返回。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值