I wanted to increase the buffer size of a c++ program so that it does not write too frequently. The default buffer is 8192 bytes, I tried to increase it to 200K with pubsetbuf.
The original code
ofstream fq(fastq1.cstr(), ios::out); // fastq1 is a file
BamReader reader; // BamReader parses and reads in "bamFile" below
reader.Open(bamFile);
while (reader.GetNext()) {
fq << bam.Name << "\n";
fq << bam.seq << "\n";
fq << bam.qual << "\n";
}
Modified
ofstream fq(fastq1.cstr(), ios::out); // fastq1 is a file with certain format
// setting buffer size to 200K
int buf_size = 204800;
char buf[buf_size];
fq.rdbuf()->pubsetbuf(buf, buf_size);
BamReader reader; // BamReader parses and reads in "bamFile" below
reader.Open(bamFile);
while (reader.GetNext()) {
fq << bam.Name << "\n";
fq << bam.seq << "\n";
fq << bam.qual << "\n";
}
However from the strace output it does not seem to make a difference before and after the change.
writev(3, [{"\n@C3A7DACXX140502:3:1209:20544:1"..., 8186}, {"ACCTCCTCCTGCTTTCACCTATCCCGCTTCAC"..., 76}], 2) = 8262
writev(4, [{"\n@C3A7DACXX140502:3:1209:20544:1"..., 8186}, {"GATCCTCGTCAGTCCTGAAGGAGTGTCAGCTT"..., 76}], 2) = 8262
writev(3, [{"\n+\nBA@CDEEEDEFEDBBDCDBDBCDCB@DDB"..., 8148}, {"??>ABEEECADDBBABBDCEBDCDCBECDBC@"..., 76}], 2) = 8224
writev(4, [{"\n+\n>>;ABCD@BEDFCDCDECCECCE?DADCE"..., 8148}, {">>;ABABBDDECEDECECCCECBBECCDDDFD"..., 76}], 2) = 8224
writev(3, [{"\n@C3A7DACXX140502:3:1209:20618:6"..., 8184}, {"TTGGAAGGCCAGGTCCAGTAACCGGCCCCATT"..., 76}], 2) = 8260
writev(4, [{"\n@C3A7DACXX140502:3:1209:20618:6"..., 8184}, {"ATTAGTAATTTCAGTGCCTCCTCCATCTTTAG"..., 76}], 2) = 8260
writev(3, [{"\n+\n?@>CCDFEEDDDCBDBDEBBCDB@CDBBB"..., 8148}, {"B@<DDDDFCEDEBBDDBDBDC@EBBECDDCEC"..., 76}], 2) = 8224
writev(4, [{"\n+\n>=;?C@?CBCCEDEAEDCDDBDDBDCDEB"..., 8148}, {">><A@BED@DDBDECBCBECCECDBDCDBEED"..., 76}], 2) = 8224
writev(3, [{"\n@C3A7DACXX140502:3:1209:20684:3"..., 8180}, {"ACCCAAATGAGATCTGTGTGCCAATGTCAGTG"..., 76}], 2) = 8256
writev(4, [{"\n@C3A7DACXX140502:3:1209:20684:3"..., 8180}, {"TCATCTGTGAACTCCACCAAGTTTTGTGCCTC"..., 76}], 2) = 8256
writev(3, [{"\n+\nBA@CCDDDFDFBBDDEBECEDBCCCEBDC"..., 8147}, {"BA?AEEEEECFDBDBBCCECCC?DBBDBDBEA"..., 76}], 2) = 8223
writev(4, [{"\n+\n>?=@BCE@EDDEEDBDDBDCEBBBBEBED"..., 8147}, {">?<ABCBBBEDECBCCDBDCDDECBBEBDDDD"..., 76}], 2) = 8223
What did I do wrong?
来源:https://stackoverflow.com/questions/29777214/how-to-increase-buffer-size-of-ofstream