繁体   English   中英

写入单个大数据文件或多个小文件:哪个更快?

[英]Writing a single large data file, or multiple smaller files: Which is faster?

我正在开发将大量数据写入磁盘的c ++程序。 以下函数gzip压缩数据并将其写出到文件中。 压缩后的数据约为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();                                                                                                 
 }

该功能将数据写入字符串流,然后我写了一个文件( fastq_gz使用升压转换器的) filtering_streambuf 该文件不是日志文件。 写入文件后,子进程将读取该文件。 该文件不需要人类查看。

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

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

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

因此,您的代码可能正在做的是(a)将文件生成到内存交换空间中,(b)从交换空间中加载并即时压缩,(c)在将压缩数据获取到外文件时写入压缩数据。

(b)和(c)很棒; (a)要杀了你。 这是两次未压缩数据的往返,其中之一与输出文件生成竞争。

我在boost iostream中找不到一个,但是您需要一个istream(源)或一台可以按需从您那里获取数据的设备。 一定有人写过(它似乎很有用),但是在看Boost iostreams文档的5分钟内我看不到它。

0.)设计一种算法,将数据分成多个文件,以便以后可以重新组合。 1.)将数据写入后台的单独线程中的多个文件中。 也许共享线程。 (也许一次启动n = 10个线程左右)。2.)查询共享对象的future属性,以检查是否已完成写入。 (大小> 1 GB)3.)出现上述情况; 然后在子进程查询时重新组合数据。4)我建议每隔1 GB写入一个新文件

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM