小编eve*_*007的帖子

如何使用Pool.map()进行多处理时解决内存问题?

我已将程序(如下)写入:

  • 读取一个巨大的文本文件 pandas dataframe
  • 然后groupby使用特定列值拆分数据并存储为数据帧列表.
  • 然后管道数据以multiprocess Pool.map()并行处理每个数据帧.

一切都很好,该程序在我的小测试数据集上运行良好.但是,当我输入大数据(大约14 GB)时,内存消耗呈指数级增长,然后冻结计算机或被杀死(在HPC群集中).

一旦数据/变量无效,我就添加了代码来清除内存.一旦完成,我也正在关闭游泳池.仍然有14 GB的输入我只期望2*14 GB的内存负担,但似乎很多正在进行.我也尝试使用调整,chunkSize and maxTaskPerChild, etc但我没有看到测试与大文件的优化有任何区别.

我认为,当我开始时,在此代码位置需要对此代码进行改进multiprocessing.

p = Pool(3) # number of pool to run at once; default at 1 result = p.map(matrix_to_vcf, list(gen_matrix_df_list.values())) 但是,我发布了整个代码.

测试示例:我创建了一个高达250 mb的测试文件("genome_matrix_final-chr1234-1mb.txt")并运行该程序.当我检查系统监视器时,我可以看到内存消耗增加了大约6 GB.我不太清楚为什么250 mb文件加上一些输出需要这么大的内存空间.如果它有助于查看真正的问题,我通过下拉框共享该文件.https://www.dropbox.com/sh/coihujii38t5prd/AABDXv8ACGIYczeMtzKBo0eea?dl=0

有人可以建议,我怎么能摆脱这个问题?

我的python脚本:

#!/home/bin/python3

import pandas as pd
import collections
from multiprocessing import Pool
import io
import time
import resource

print()
print('Checking required modules')
print()


''' change this input file name and/or …
Run Code Online (Sandbox Code Playgroud)

python memory multiprocessing pandas python-multiprocessing

19
推荐指数
3
解决办法
5656
查看次数

如何读取/打印(_io.TextIOWrapper)数据?

使用以下代码我想>打开文件>读取内容并去除不需要的行>然后将数据写入文件并读取文件以进行下游分析.

with open("chr2_head25.gtf", 'r') as f,\
    open('test_output.txt', 'w+') as f2:
    for lines in f:
        if not lines.startswith('#'):
            f2.write(lines)
    f2.close()
Run Code Online (Sandbox Code Playgroud)

现在,我想读取f2数据并在pandas或其他模块中进行进一步处理,但我在读取数据时遇到问题(f2).

data = f2 # doesn't work
print(data) #gives
<_io.TextIOWrapper name='test_output.txt' mode='w+' encoding='UTF-8'>

data = io.StringIO(f2)  # doesn't work
# Error message
Traceback (most recent call last):
  File "/home/everestial007/PycharmProjects/stitcher/pHASE-Stitcher-Markov/markov_final_test/phase_to_vcf.py", line 64, in <module>
data = io.StringIO(f2)
TypeError: initial_value must be str or None, not _io.TextIOWrapper
Run Code Online (Sandbox Code Playgroud)

python printing io typeerror word-wrap

16
推荐指数
1
解决办法
3万
查看次数

如何从文件中读取两行并在for循环中创建动态键,后续操作

这个问题遵循问题:如何从文件中读取两行并在for循环中创建动态键?

但是,问题的性质已演变为我想要解决的某种复杂性.

下面是按空格分隔的数据结构.

chr pos         M1  M2  Mk  Mg1  F1_hybrid     F1_PG    F1_block    S1  Sk1   S2    Sj
2   16229767    T/T T/T T/T G/T C|T 1|0 726  .  T/C T/C T/C
2   16229783    C/C C/C C/C A/C G|C 0|1 726 G/C G/C G/C C|G
2   16229992    A/A A/A A/A G/A G|A 1|0 726 A/A A/A A/A A|G
2   16230007    T/T T/T T/T A/T A|T 1|0 726 A|T A|T A|T A|T
2   16230011    G/G G/G G/G G/G C|G 1|0 726 G/C C|G …
Run Code Online (Sandbox Code Playgroud)

python dictionary numpy pandas defaultdict

9
推荐指数
1
解决办法
596
查看次数

如何根据列值的长度从pandas数据帧中删除一行?

在以下内容中pandas.DataFframe:

df = 
    alfa    beta   ceta
    a,b,c   c,d,e  g,e,h
    a,b     d,e,f  g,h,k
    j,k     c,k,l  f,k,n
Run Code Online (Sandbox Code Playgroud)

如何删除alfa的列值超过2个元素的行?这可以使用长度函数来完成,我知道但没有找到具体的答案.

df = df[['alfa'].str.split(',').map(len) < 3]
Run Code Online (Sandbox Code Playgroud)

python string-length dataframe pandas

9
推荐指数
2
解决办法
6859
查看次数

如何在 pytest 中断言 UserWarning 和 SystemExit

在 pytest 中断言 UserWarning 和 SystemExit

在我的应用程序中,我有一个函数,当提供错误的参数值时,它将UserWarningswarnings模块引发,然后SystemExitsys模块引发。

代码是这样的:

def compare_tags(.....):

    requested_tags = user_requested_tags # as list
    all_tags = tags_calculated_from_input_file  # as list 

    non_matching_key = [x for x in requested_tags if x not in all_tags]

    # if user requested non existing tag then raise warning and then exit 
    if len(non_matching_key) > 0:

        # generate warning
        warnings.warn("The requested '%s' keys from '%s' is not present in the input file. Please makes sure the input …
Run Code Online (Sandbox Code Playgroud)

python unit-testing systemexit user-warning pytest

8
推荐指数
1
解决办法
1491
查看次数

使用谷歌应用程序脚本登录网站并点击以抓取数据

我想登录一个网站并导航到特定页面以抓取数据。我计划使用抓取(目前不是 API),出于学习目的,我计划在我的 stackoverflow 帐户上进行此操作,以提取我的声誉分数随时间的变化情况以及在哪个主题上的变化。

而且,我使用谷歌应用程序脚本作为编程语言,也是出于学习目的。

我使用下面给出的代码进行登录:

function stackLogin() {

  var url = "https://stackoverflow.com/users/login?ssrc=head";
  //var url = "https://stackoverflow.com/";

  var payload = {
    "email":"myLogin",
    "password":"myPassword"
  };


  var opt = {
    "payload":payload,
    "method":"post",
    "followRedirects": false
  };  

  var response = UrlFetchApp.fetch(url, opt);
  var sessionDetails = response.getAllHeaders()['Set-Cookie'];
  var header = {
    'Cookie': sessionDetails[1]
  };  

  Logger.log(response.getResponseCode()); 
  Logger.log(response);  
}
Run Code Online (Sandbox Code Playgroud)


当我使用时:

url = "https://stackoverflow.com/users/login?ssrc=head"
Run Code Online (Sandbox Code Playgroud)

我得到“响应代码 = 302”,但“响应 html”非常短。我还看到StackExchange OpenID上出现了新的登录 ip 在此输入图像描述


但是,如果我使用:

url = "https://stackoverflow.com"
Run Code Online (Sandbox Code Playgroud)

我得到“响应代码 = 200”,并且“响应 html”非常长。 …

screen-scraping login-control http-response-codes web-scraping google-apps-script

6
推荐指数
0
解决办法
4088
查看次数

如何使用键合并`defaultdict`中的列表,但在该键中保持列表分开?

我想合并包含defaultdict来自两个不同数据/文件的类(键)和列表值的列表。我想使用唯一键合并列表,但将列表值分开。

输入:

defaultdict(<class 'list'>, {'1335': ['C', 'T', 'T', 'C', 'T', 'G'], '254': ['T', 'T', 'G', 'C', 'G', 'G']})

defaultdict(<class 'list'>, {'1335': ['A', 'C', 'A', 'A', 'C', 'A'], '254': ['A', 'G', 'A', 'T', 'A', 'A']})

输出:

defaultdict(<class 'list'>, {'1335': ['C', 'T', 'T', 'C', 'T', 'G'], ['A', 'C', 'A', 'A', 'C', 'A'] , '254': ['T', 'T', 'G', 'C', 'G', 'G'], ['A', 'G', 'A', 'T', 'A', 'A']})

谢谢,

python dictionary for-loop list defaultdict

5
推荐指数
1
解决办法
1108
查看次数

如何从文件中读取两行并在for循环中创建动态键?

在以下数据中,我试图运行一个简单的马尔可夫模型.

假设我有一个具有以下结构的数据:

pos   M1  M2  M3  M4  M5  M6  M7  M8  hybrid_block    S1    S2    S3    S4  S5  S6  S7  S8
1     A   T   T   A   A   G   A   C       A|C         C     G     C     T    T   A   G   A
2     T   G   C   T   G   T   T   G       T|A         A     T     A     T    C   A   A   T
3     C   A   A   C   A   G   T   C       C|G         G     A     C     G    C   G   C   G
4     G   T   G   T   A …
Run Code Online (Sandbox Code Playgroud)

python dictionary numpy pandas defaultdict

5
推荐指数
1
解决办法
160
查看次数

scipy.stats 上的导入错误

我正在尝试使用 python 程序,它需要 scipy 依赖项。依赖项scipy已安装,但我需要调用scipy.statsand thenbinom位于scipy.

\n\n

我尝试了这些答案中的方法:

\n\n

导入 scipy.stats 错误\n

\n\n

没有名为 scipy.stats 的模块 - 为什么尽管安装了 scipy\n

\n\n
>>> import scipy\n>>> import scipy.stats\nTraceback (most recent call last):\n  File "<stdin>", line 1, in <module>\nImportError: No module named stats\n>>> from scipy import stats\nTraceback (most recent call last):\n  File "<stdin>", line 1, in <module>\nImportError: cannot import name stats\n>>> from scipy.stats import binom\nTraceback (most recent call last):\n  File "<stdin>", line 1, in <module>\nImportError: No …
Run Code Online (Sandbox Code Playgroud)

python package scipy python-import importerror

5
推荐指数
1
解决办法
2万
查看次数

为什么 `Pool.map()` 多处理中的内存消耗急剧增加?

我正在对 pandas 数据帧进行多重处理,方法是将其拆分为多个数据帧,这些数据帧存储为列表。并且,使用Pool.map()我将数据帧传递给定义的函数。我的输入文件约为“300 mb”,因此小数据帧大约为“75 mb”。但是,当多处理运行时,内存消耗会增加 7 GB,每个本地进程大约消耗 1 GB 内存。2 GB 内存。为什么会发生这种情况?

def main():

    my_df = pd.read_table("my_file.txt", sep="\t")
    my_df = my_df.groupby('someCol')

    my_df_list = []
    for colID, colData in my_df:
        my_df_list.append(colData)

    # now, multiprocess each small dataframe individually    
    p = Pool(3)
    result = p.map(process_df, my_df_list)

    p.close()
    p.join()

    print('Global maximum memory usage: %.2f (mb)' % current_mem_usage())

    result_merged = pd.concat(result)

    # write merged data to file


def process_df(my_df):
    my_new_df = do something with "my_df"

    print('\tWorker maximum memory usage: %.2f (mb)' % …
Run Code Online (Sandbox Code Playgroud)

python multiprocessing threadpool pandas python-multiprocessing

5
推荐指数
0
解决办法
231
查看次数