c++ - 写入单个大数据文件或多个较小文件: Which is faster?

标签 c++ linux filesystems file-writing

我正在开发一个将大量数据写入磁盘的 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();                                                                                                 
 }

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

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

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

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

最佳答案

因此,您的代码可能正在执行的操作是(a)将文件生成到内存交换空间中,(b)从交换空间加载并动态压缩,(c)将压缩数据写入输出文件。

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

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

关于c++ - 写入单个大数据文件或多个较小文件: Which is faster?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49242063/

相关文章:

qt - 使用不同的文件系统库实现Qt文件对话框( boost )

c++ - 我可以使用priority_queue底层容器的成员函数吗

c - 使用管道进行进程通信

linux - 反向搜索在 Linux 中不起作用

linux - 将项目添加到启动脚本并以特定用户身份运行?

python - python中的数据结构 : maintaining filesystem structure within a database

c++ - 操作系统循环变量堆栈问题

c++ - Armadillo C++ : matrix initialization from array

c++ - g++ 和 clang++ SFINAE 和 SFINAE 失败的不同行为

filesystems - 具有共享文件系统的 ActiveMQ HA 选项