Python/too many open files 的正确解决方法

Python/too many open files 的正确解决方法

一般的解决方法

基本思路是,将DataFrame拆成若干组分,最后通过pandas.concat合并起结果

在 Linux 环境下进行文件相关的处理时,可能会出现 OSError: [Errno 24] Too many open files 的错误。

原因是 linux 中每个进程都会限制打开的文件数量。

使用 ulimit -n 可以查看每个进程最大的文件数量,默认是 1024,可以通过修改这个参数来放宽文件数量的限制:ulimit -n 4096,这个方法只对当前的 shell 有用,退出再重新登录就会恢复为默认值。

也可以修改配置文件 /etc/security/limits.conf,在文件最后加入如下两行即可:

1
2
* soft nofile 4096   
* hard nofile 4096

* 表示用户,如果需要指定某个用户,例如 test

1
2
test soft nofile 4096   
test hard nofile 4096

也可以简写为一行:

1
test - nofile 4096

但上面说的方法都是治标不治本,因为根本原因是你的代码打开了太多的文件并且没有及时关闭。

正确的解决方法是

正确的解决方法

可以通过如下命令查看你进程打开的文件名,例如 进程 id 为 24404:

1
lsof -p 24404

查看打开而没有关闭的文件,然后再仔细检查代码里打开文件的代码,并添加关闭文件的代码即可。

通过如下命令可以查看进程打开的文件数量:

1
lsof -p 24404 | wc -l
Python/Python 文本处理的编码

Python/Python 文本处理的编码

在 Python 3 中读写文件时,我们需要注意读取文件和写入文件时的数据格式,是 str 类型,还是 byte 类型。

在我看来,str 类型相当于 Java 中的字符流,是有一个编码的;而 byte 相当于 Java 中的字节流,是没有编码的。

先搞清楚几个概念:

阅读更多
Python/pip 和 conda 修改源
Python/使用 anaconda 管理多个版本的 CUDA

Python/使用 anaconda 管理多个版本的 CUDA

虽然现在 Tensorflow 2 已经发布一段时间了,但仍然有很多历史代码是基于 Tensorflow 1 的。

由于经常需要复现过去的论文的代码,需要使用 Tensorflow 1 的 GPU 版本 ,而我的服务器已经安装了 Tensorflow 2 的 GPU 版本。

Tensorflow 2Tensorflow 1 的 GPU 版本需要的 CUDA 和 cudnn 版本都不一样。

下面来看看如何在一个同一个服务器上,安装不同版本的 Tensorflow GPU 版本。

阅读更多
Python/Python 的 uppack(解包参数)
Python/PyCharm 使用了 pytest 来执行代码,应该如何修改?
Python/python2 安装 opencv 出错

Python/python2 安装 opencv 出错

我使用 Anaconda 创建了一个 python2.7 的环境,然后安装 opencv: pip install opencv-python

出现 TypeError: 'NoneType' object is not iterable 错误。

完整错误信息如下:

阅读更多
Python/Jupyter Notebook Python 减少内存消耗的方法

Python/Jupyter Notebook Python 减少内存消耗的方法

基本思路

在 Jupyter Notebook 中运行 Python 代码时,如果使用了太多的内存,那么会报Memory Error的错误。这表示前面的变量使用了太多的内存。

事后减少内存

在有一次数据建模中,由于前面进行了很多数据处理的工作,创建了非常多临时的DataFrame,运行到后面的代码时,前面大部分的变量都已经用不上了,但是它们还占据着内存,因此产生了内存不足的错误。

阅读更多
Python/python 使用 concurrent.futures 多进程注意事项

Python/python 使用 concurrent.futures 多进程注意事项

线程池和进程池

concurrent.futures 是 Python3.2 加入标准库的一个模块,它提供异步执行回调高层接口,是对线程池和进程池的进一步封装,让开发者可以使用统一的接口非常容易的使用线程池和进程池。

这个模块中有两个核心的类:ThreadPoolExecutor (线程池)和ProcessPoolExecutor(进程池)。

阅读更多
Python/使用多进程处理 DataFrame

Python/使用多进程处理 DataFrame

基本思路是,将DataFrame拆成若干组分,最后通过pandas.concat合并起结果

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
def parallelize_dataframe(df, func, n_jobs=3, split_num=10):
## 拆分数据表
df_split = np.array_split(df, split_num)
pool = Pool(n_jobs)
df_list = []

## map操作
for df_element in tqdm_notebook(pool.imap(func, df_split), total=10000):
df_list.append(df_element)

## reduce操作
df = pd.concat(df_list)

## 关闭进程
pool.close()
pool.join()
return df

还可以使用tqdm在处理数据时显示进度条。