在C语言中可以并行执行输入/输出操作吗?

在C语言中可以并行执行输入/输出操作吗?,c,file-io,parallel-processing,openmp,C,File Io,Parallel Processing,Openmp,我想在.csv文件中用c写一个大数组。 有没有可能并行地写呢 也许使用OpenMP 我想并行化的代码是文件中的典型IO操作。 给定大小为n的ResultVector 1和ResultVector 2 fp=fopen("output.csv","w+"); for(i=0;i<n;i++){ fprintf(fp,"%f,%f\n",resultVector1[i],resultVector2[i]); } fclose(fp); fp=fopen(“output.csv”,“w

我想在.csv文件中用c写一个大数组。 有没有可能并行地写呢

也许使用OpenMP

我想并行化的代码是文件中的典型IO操作。 给定大小为n的ResultVector 1和ResultVector 2

fp=fopen("output.csv","w+");
for(i=0;i<n;i++){
    fprintf(fp,"%f,%f\n",resultVector1[i],resultVector2[i]);
}
fclose(fp);
fp=fopen(“output.csv”,“w+”);

对于(i=0;i您在尝试对单个文件执行并行写入时将遇到许多问题

在执行写入操作或创建新文件之前,w+会将现有文件的长度截断为0,您将如何协调并行文件指针的写入

在任何情况下,如果您有多个写入程序,您将需要同步它们,并且您将失去与顺序写入相比所具有的任何速度优势。事实上,由于同步开销,它们可能会比单个专用顺序写入线程慢

再仔细考虑一下你的问题。如果你真的有一个巨大的数组,比如说5亿个整数,你真的需要最快的方法来读/写这个数组到一个持久文件中。你可以用数组除以你可以分配的专用线程数,把每个段写到一个单独的文件中。然后你可以把这个数组读回你的文件中在这种情况下,您可以对模式类型使用并行方式,并避免单个文件的同步锁定开销

因此,在我给出的示例中,如果有4个线程,则将数组划分为四分之一,其中每个线程将向其单独的文件写入/读取自己的四分之一


注意:如果所有文件都在同一个磁盘驱动器上,则在磁盘的不同部分同时执行多个读/写操作时,可能会有一些I/O速度减慢。如果您能够将每个文件保存到不同的磁盘/服务器,则可能会产生这种效果。

您可以打开2个文件,并将每个向量写入自己的文件中,这可能会有所帮助p但我不打赌,我认为这取决于你平台的架构。另外,如果你需要在同一个文件中同时使用这两个文件,你仍然需要将其复制在一起,这同样需要时间

此外,对硬盘驱动器本身的写入可能是这里的瓶颈,因此无需加快向硬盘驱动器填充缓冲区的速度


您可能会在两个不同的硬盘上打开两个文件,但我仍然怀疑这是否会给您带来真正的速度。

这个问题促使我编写
pread
,这是一种使用
pthread
库实现的并行读取方法thod将输入文件切成大小大致相等的块,并将每个块分配给一个线程。然后,每个线程开始使用
fread
从文件的不同偏移量并行读取文件,并使用预定义的
buffersize
。您可以找到实现


这是一个正在进行的实现,我仍在并行写端工作。

您当然知道文本文件是一种固有的顺序数据结构?如果您想保持向量中的顺序,我认为这是不可能的。(至少您建议的代码行不可能)。在我所了解的体系结构上,仍然向存储写入数据是一个连续的过程。但是,如果我被证明是错误的,我仍然希望这样做。如果您是从单独的线程或分支(进程)写入数据您可以使用
mutex
来确保每一行都是以原子方式写入的。但是请注意,除非您在每次写入之间执行几十次或数百次操作,否则您将花费所有时间(空闲地)等待互斥体变为可用。在这种情况下,您肯定应该避免过早优化。我可以看到使用
mmap
将文件的多个区域映射到内存中,并让单独的线程填充每个区域。困难在于每个段需要有一个预定的大小,因为CSV是一个文本文件,并且偏移量文本文件中一行文本的大小取决于之前的所有文本。因此,某种填充、固定长度的行或其他东西加上
fopen
会打开一个序列流,如果我没记错的话,它又是一个序列流。嗯,HDF5文件似乎可以像和@MarouenBenGuebila一样读入。是的,你是正确的,但HDFS文件不是单声道文件但它被分成许多部分,可以使用并行读取同时读取。这正是我上面描述的解决方案。您可以将数组划分为子部分,将每个子部分白色化为自己的文件,然后通过并行读取同时读取这些文件。这可以在任何支持并行库并具有多个处理器。