我在使用 #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) 在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)