小编Mut*_*key的帖子

使用 omp Parallel for 时出现分段错误,但不按顺序使用

我在使用 #pragma omp parallel 时遇到问题

基本上我有数百个 DNA 序列,我想用一种称为 NNLS 的算法来运行它们。

我认为并行执行会给我带来相当好的速度,因此我应用了 #pragma 运算符。

当我顺序运行它时,没有问题,结果很好,但是当我使用 #pragma omp parallel 运行它时,我在算法中遇到了段错误(有时在不同的点)。

#pragma omp parallel for
for(int i = 0; i < dir_count; i++ ) {

  int z = 0;
  int w = 0;
  struct dirent *directory_entry;
  char filename[256];

  directory_entry = readdir(input_directory_dh);

  if(strcmp(directory_entry->d_name, "..") == 0 || strcmp(directory_entry->d_name, ".") == 0) {
    continue;
  }

  sprintf(filename, "%s/%s", input_fasta_directory, directory_entry->d_name);

  double *count_matrix = load_count_matrix(filename, width, kmer);

  //normalize_matrix(count_matrix, 1, width)
  for(z = 0; z < width; z++) …
Run Code Online (Sandbox Code Playgroud)

c parallel-processing openmp libgomp

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

使用Python的Popen替换Bash样式进程

在Bash中,您可以轻松地将进程的输出重定向到临时文件描述符,并且所有这些都由bash自动处理,如下所示:

$ mydaemon --config-file <(echo "autostart: True \n daemonize: True")
Run Code Online (Sandbox Code Playgroud)

或者像这样:

$ wc -l <(ls)
15 /dev/fd/63
Run Code Online (Sandbox Code Playgroud)

看看它是如何不是stdin重定向:

$ vim <(echo "Hello World") 
vim opens a text file containing "Hello world"
$ echo  "Hello World" | vim
Vim: Warning: Input is not from a terminal
Run Code Online (Sandbox Code Playgroud)

您可以在第二个示例中看到bash如何自动创建文件描述符,并允许您将程序的输出传递给另一个程序.

现在谈到我的问题:如何在Python中使用Popen在子进程模块中做同样的事情?

我一直在使用普通的kmers文件并只是读取它,但我的程序现在根据用户参数在运行时生成一个特定的kmers列表.我想避免手动写入临时文件,因为处理文件权限可能会导致我的原始用户出现问题.

这是我运行程序并使用实际文件"kmer_file"捕获stdout的代码

input_file = Popen(["pram_axdnull", str(kmer), input_file, kmer_file], stdout=PIPE)
Run Code Online (Sandbox Code Playgroud)

我创建了一个名为generate_kmers的函数,它返回一个可以轻松写入文件的字符串(包括换行符)或StringIO.我还有一个独立的python脚本来做同样的事情

所以现在我想把它作为我的第三个参数传递:

这不起作用:

kmer_file = stringIO(generate_kmers(3))
input_file = Popen(["pram_axdnull", str(kmer), input_file, kmer_file], stdout=PIPE)
Run Code Online (Sandbox Code Playgroud)

这也不是:

kmer_file = Popen(["generate_kmers", str(kmer)], stdout=PIPE)
input_file = Popen(["pram_axdnull", str(kmer), input_file, …
Run Code Online (Sandbox Code Playgroud)

python bash subprocess popen

4
推荐指数
1
解决办法
2419
查看次数

标签 统计

bash ×1

c ×1

libgomp ×1

openmp ×1

parallel-processing ×1

popen ×1

python ×1

subprocess ×1