编写单个大型数据文件或多个较小的文件:哪个更快?

时间:2018-03-12 18:23:31

标签: c++ linux filesystems file-writing

我正在开发一个将大量数据写入磁盘的c ++程序。以下函数gzips数据并将其写入文件。压缩数据大约为100GB。压缩和写出数据的功能如下:

 void constructSNVFastqData(string const& fname) {                                 
   ofstream fastq_gz(fname.c_str());                                           
   stringstream ss;                                                                
   for (int64_t i = 0; i < snvId->size(); i++) {                            
     consensus_pair &cns_pair = snvId->getPair(i);                                 
     string qual(cns_pair.non_mutated.size(), '!');                                
      ss << "@" + cns_pair.mutated + "[" + to_string(cns_pair.left_ohang) +         
            ";" + to_string(cns_pair.right_ohang) + "]\n" 
             + cns_pair.non_mutated + "\n+\n" + qual + "\n";                                            
   }                                                                               
   boost::iostreams::filtering_streambuf<boost::iostreams::input> out;             
   out.push(boost::iostreams::gzip_compressor());                                  
   out.push(ss);                                                                   
   boost::iostreams::copy(out,fastq_gz);                                           
   fastq_gz.close();                                                                                                 
 }

该函数将数据写入字符串流,然后我 使用boost fastq_gz写出文件(filtering_streambuf)。 该文件不是日志文件。文件写完后 它将由子进程读取。该文件不需要查看 由人类。<​​/ p>

目前,我正在将数据写入单个大文件(fastq_gz)。这需要一段时间,文件系统 - 根据我们的系统管理员 - 非常繁忙。我想知道是否应该写出一些较小的文件,而不是写出一个大文件?这种方法会更快,还是减少文件系统的负载?

请注意,压缩不是很慢 - 我已经进行了基准测试。

我在linux系统上运行,不需要考虑将实现推广到Windows文件系统。

2 个答案:

答案 0 :(得分:0)

所以你的代码可能正在做的是(a)将文件生成到内存交换空间,(b)从交换空间加载并动态压缩,(c)在将压缩数据输出到outfile时写入。 / p>

(b)和(c)很棒; (a)会杀了你。它是未压缩数据的两个roundmtrips,其中一个与输出文件生成竞争。

我在boost iostreams中找不到一个,但你需要一个istream(源代码)或一个可以根据需要从你那里获取数据的设备。有人必须写它(它看起来很有用),但是在5分钟内我看不到提升iostreams文档。

答案 1 :(得分:-2)

0。)设计一种算法将数据分成多个文件,以便以后重新组合。 1.)在后台的不同线程上将数据写入多个文件。也许共享线程。 (也许一次开始n = 10个线程) 2.)查询共享对象的future属性以检查写入是否完成。 (尺寸> 1 GB) 3.)一旦达到上述情况;然后在子进程查询时重新组合数据 4.)我建议每1 GB后写一个新文件