473,503 Members | 6,587 Online
Bytes | Software Development & Data Engineering Community
+ Post

Home Posts Topics Members FAQ

output to a file (stream performance)

Lee
Hi,

I'm a stream virgin and am attempting to output strings to a file. My
approach is to write the string initially to a 'stringstream' and only when
complete write the stringstream to the file (ofstream).

The process works fine however appears to be rather slow. For example
outputting about 2Mb of data takes a couple of minutes (most of the time
appears to be writing to the stringstream) and as I'm creating several
hundred files in one run the whole time can run into hours. Oh, the files
are on my harddrive hence there is no network performance issues.

Is there anything basic I'm doing wrong (see code below) or does anyone have
any suggestions to improve this performance.

Thank in advance
Lee
stringstream m_outputFileReference;
ofstream m_outputFile ;

//initialisation for each file produced
m_outputFile.open(fullPathName, fstream::out) ;
m_outputFileReference.str("") ;
m_outputFileReference.clear() ;

// output data using the format below
m_outputFileReference << CC_NUM_START_OPEN << tempStr << CC_NUM_START_CLOSE
;

when complete send the stringstream to the file
m_outputFile << m_outputFileReference.str()
m_outputFile.close();

Mar 8 '06 #1
7 9972
Lee wrote:
Hi,

I'm a stream virgin and am attempting to output strings to a file. My
approach is to write the string initially to a 'stringstream' and only when
complete write the stringstream to the file (ofstream).

The process works fine however appears to be rather slow. For example
outputting about 2Mb of data takes a couple of minutes (most of the time
appears to be writing to the stringstream) and as I'm creating several
hundred files in one run the whole time can run into hours. Oh, the files
are on my harddrive hence there is no network performance issues.

Is there anything basic I'm doing wrong (see code below) or does anyone have
any suggestions to improve this performance.

Thank in advance
Lee
stringstream m_outputFileReference;
ofstream m_outputFile ;

//initialisation for each file produced
m_outputFile.open(fullPathName, fstream::out) ;
m_outputFileReference.str("") ;
m_outputFileReference.clear() ;

// output data using the format below
m_outputFileReference << CC_NUM_START_OPEN << tempStr << CC_NUM_START_CLOSE
;

when complete send the stringstream to the file
m_outputFile << m_outputFileReference.str()
m_outputFile.close();


why not just:

ofstream m_outputFile(fullPathName, fstream::out);
m_outputFile << CC_NUM_START_OPEN << tempStr << CC_NUM_START_CLOSE;

Regards,
Ben
Mar 8 '06 #2
Lee wrote:
My
approach is to write the string initially to a 'stringstream' and only
when complete write the stringstream to the file (ofstream).
Why though? You could immediately write to the file.
The process works fine however appears to be rather slow.
It probably depends on the implementation of the stream buffer
underlying the string stream: some implementation stick to the
[original] words in the standard which mandate that the buffer
in a string stream shall increase by just one position and/or
they implement the buffer to grow by some fixed amount, e.g.
128 characters (yes, I have seen this is in actual code of a
commercial 'basic_stringbuf' implementation). This will cause
the string stream to spent its time mostly for copying
increasingly larger chunks of memory around.

The obvious work-around is to avoid this by using a file stream
immediately and just streaming the data there. If this is not
an option for whatever reason, the best bet is to *not* use a
string stream but rather a stream based on a simple handcrafted
stream buffer which simply extends the internal buffer by some
factor e.g. duplicating the size whenever the buffer runs full.
I think I have posted the corresponding code in the past but it
is not really hard to create anyway (just something like 20 lines
of code).
stringstream m_outputFileReference;
There is no good reason to use a 'std::stringstream' in this
situation anyway: you want to use a 'std::ostringstream'. However,
this change will probably not remove your problem.
ofstream m_outputFile ;

//initialisation for each file produced
m_outputFile.open(fullPathName, fstream::out) ; m_outputFileReference.str("") ;
m_outputFileReference.clear() ;


You don't need to perform the above two operations: after
construction, the string stream is empty and in a 'good()'
state.
--
<mailto:di***********@yahoo.com> <http://www.dietmar-kuehl.de/>
<http://www.eai-systems.com> - Efficient Artificial Intelligence
Mar 8 '06 #3
Lee
I tried this originally but when the files were across a network the
performance was even worse.

Lee

"benben" <be******@yahoo.com.au> wrote in message
news:44**********************@news.optusnet.com.au ...
Lee wrote:
Hi,

I'm a stream virgin and am attempting to output strings to a file. My
approach is to write the string initially to a 'stringstream' and only when complete write the stringstream to the file (ofstream).

The process works fine however appears to be rather slow. For example
outputting about 2Mb of data takes a couple of minutes (most of the time
appears to be writing to the stringstream) and as I'm creating several
hundred files in one run the whole time can run into hours. Oh, the files are on my harddrive hence there is no network performance issues.

Is there anything basic I'm doing wrong (see code below) or does anyone have any suggestions to improve this performance.

Thank in advance
Lee
stringstream m_outputFileReference;
ofstream m_outputFile ;

//initialisation for each file produced
m_outputFile.open(fullPathName, fstream::out) ;
m_outputFileReference.str("") ;
m_outputFileReference.clear() ;

// output data using the format below
m_outputFileReference << CC_NUM_START_OPEN << tempStr << CC_NUM_START_CLOSE ;

when complete send the stringstream to the file
m_outputFile << m_outputFileReference.str()
m_outputFile.close();


why not just:

ofstream m_outputFile(fullPathName, fstream::out);
m_outputFile << CC_NUM_START_OPEN << tempStr << CC_NUM_START_CLOSE;

Regards,
Ben

Mar 8 '06 #4
> I tried this originally but when the files were across a network the
performance was even worse.


Looks like the ofstream buffer isn't generous enough...and so it causes
lots of network traffic if I am not too mistaken.

If cross-platform is not an issue you may try platform-dependent support
which tends to have more optimization features.

Using a stringstream like a buffer is very odd a solution.

Regards,
Ben
Mar 8 '06 #5
Lee
Many thanks for the reply. I tried using the file stream directly but when
the files were over a network the performance was even worse.

Using a hand crafted stream buffer sounds good. I'm not to sure how
exactly - can this be achieved by creating a new class based upon streambuf
and utilsing the 'setbuf' function to control the buffer size.

thanks
Lee
"Dietmar Kuehl" <di***********@yahoo.com> wrote in message
news:47************@individual.net...
Lee wrote:
My
approach is to write the string initially to a 'stringstream' and only
when complete write the stringstream to the file (ofstream).


Why though? You could immediately write to the file.
The process works fine however appears to be rather slow.


It probably depends on the implementation of the stream buffer
underlying the string stream: some implementation stick to the
[original] words in the standard which mandate that the buffer
in a string stream shall increase by just one position and/or
they implement the buffer to grow by some fixed amount, e.g.
128 characters (yes, I have seen this is in actual code of a
commercial 'basic_stringbuf' implementation). This will cause
the string stream to spent its time mostly for copying
increasingly larger chunks of memory around.

The obvious work-around is to avoid this by using a file stream
immediately and just streaming the data there. If this is not
an option for whatever reason, the best bet is to *not* use a
string stream but rather a stream based on a simple handcrafted
stream buffer which simply extends the internal buffer by some
factor e.g. duplicating the size whenever the buffer runs full.
I think I have posted the corresponding code in the past but it
is not really hard to create anyway (just something like 20 lines
of code).
stringstream m_outputFileReference;


There is no good reason to use a 'std::stringstream' in this
situation anyway: you want to use a 'std::ostringstream'. However,
this change will probably not remove your problem.
ofstream m_outputFile ;

//initialisation for each file produced
m_outputFile.open(fullPathName, fstream::out) ;

m_outputFileReference.str("") ;
m_outputFileReference.clear() ;


You don't need to perform the above two operations: after
construction, the string stream is empty and in a 'good()'
state.
--
<mailto:di***********@yahoo.com> <http://www.dietmar-kuehl.de/>
<http://www.eai-systems.com> - Efficient Artificial Intelligence

Mar 8 '06 #6
Lee wrote:
Using a hand crafted stream buffer sounds good. I'm not to sure how
exactly - can this be achieved by creating a new class based upon
streambuf and utilsing the 'setbuf' function to control the buffer size.


'setbuf()' is the wrong tool: it has essentially no useful guarantees.
The only guarantee it has is that 'setbuf(0, 0)' will turn a file
stream to become unbuffered. You might be able to set a buffer size
suiting your need for file streams but this is implementation specific.

To create a useful surrogate for a string stream, you would derive a
class from 'std::streambuf' and essentially just override the
'overflow()' method to install more room. Essentially the code for
the stream buffer would look like this (note: the code is untested,
not even compiled):

class mystringbuf:
std::streambuf
{
public:
enum { initial = 1024 };
mystringbuf(): m_buffer(new char[initial])
{ this->setp(this->m_buffer, this->m_buffer + initial); }
~mystringbuf() { delete[] this->m_buffer; }

private:
int_type overflow(int_type c)
{
// increase the buffer
if (this->pptr() == this->epptr())
{
ptrdiff_t size = this->pptr() - this->pbase();
char* tmp = new char[2 * size];
std::copy(this->pbase(), this->pptr(), tmp);
this->setp(tmp, tmp + 2 * size);
this->pbump(size);
std::swap(tmp, this->m_buffer);
delete[] tmp;
}

// put the character into the buffer
if (c != std::char_traits<char>::eof())
{
*this->pptr() = std::char_traits<char>::to_char_type(c);
this->pbump(1);
}

// signal success
return std::char_traits<char>::not_eof(c);
}
char* m_buffer;
};

You would, of course, still need some method to access the buffer
but this can be anything to your liking. I would probably provide
a pair of iterators and/or a pointer to the start plus the current
size (this would be useful to pass it to 'sputn()' of the file
stream's 'rdbuf()').
--
<mailto:di***********@yahoo.com> <http://www.dietmar-kuehl.de/>
<http://www.eai-systems.com> - Efficient Artificial Intelligence
Mar 8 '06 #7

Lee wrote:
Hi,

I'm a stream virgin and am attempting to output strings to a file. My
approach is to write the string initially to a 'stringstream' and only when
complete write the stringstream to the file (ofstream). [snip] Is there anything basic I'm doing wrong (see code below) or does anyone have
any suggestions to improve this performance.

[snip]

http://groups.google.com/group/perfo...73f4d1a05cfbd1 contains
various testsuites to measure comparative performance of "Reading file
into string".
Perhaps, it is worth building similar testsuites to measure comparative
performance of "Writing string to file", for instance.

---
Alex Vinokur
email: alex DOT vinokur AT gmail DOT com
http://mathforum.org/library/view/10978.html
http://sourceforge.net/users/alexvn

Mar 8 '06 #8

This thread has been closed and replies have been disabled. Please start a new discussion.

Similar topics

1
1479
by: joy_julia446 | last post by:
Hi there, I would like to print my result as below in an output file. I would appreciate if someone can give me some advice. RESULT ClassA,96.678,88.196,8.048,-0.233,456.231,5.890, 1...
4
2190
by: Anton Pervukhin | last post by:
Hi everybody! I have a small problem regarding the initialization of pointer to the file stream under some conditions. Imagine a class which has a pointer to output file stream and some...
3
2206
by: frustrated | last post by:
I am trying to share a file stream between two threads, but havent got a clue as to how to do it. The first thread will be reading the file, and the second thread will(/might) be writing to the...
10
3126
by: m00nm0nkey | last post by:
Hello. I am trying to split a file with 334,386 lines into seperate files of 50,000 each. This is the code i am running: Dim intFragmentRawIndex As Integer Dim swRawDataFile As StreamWriter...
0
1788
by: jebbyleezer | last post by:
Hello, I have source code that builds correctly, however, after the program terminates the output file produced is empty. Here is my source code: import java.io.*; import java.util.Scanner;...
1
1250
by: rahulrsh | last post by:
I am doing an image processing project which requires multiple threads to operate and write to an output file stream... Is is possible by some function to read and write specific locations of a file...
5
6846
by: Nitin Mahajan | last post by:
Guys Is there a way in C# to create a word object directly from a memory stream without passing that to hard disk (file stream). I think it doesn't makes sense to create a file just to read it...
5
1966
by: cnoe | last post by:
I need to program this. I'm not asking any code, but an idea from you would be helpful. Thanks. I open a binary file stream, which has millions or trillions of 1's & 0's some thing like this...
0
1187
code green
by: code green | last post by:
I am using the following to force a file dialog box to open header('Content-Disposition: attachment; filename="'.$filename.'"'); header('Content-type: text/csv');Then open a file stream with return...
0
7193
marktang
by: marktang | last post by:
ONU (Optical Network Unit) is one of the key components for providing high-speed Internet services. Its primary function is to act as an endpoint device located at the user's premises. However,...
0
7264
Oralloy
by: Oralloy | last post by:
Hello folks, I am unable to find appropriate documentation on the type promotion of bit-fields when using the generalised comparison operator "<=>". The problem is that using the GNU compilers,...
0
7316
jinu1996
by: jinu1996 | last post by:
In today's digital age, having a compelling online presence is paramount for businesses aiming to thrive in a competitive landscape. At the heart of this digital strategy lies an intricately woven...
1
6975
by: Hystou | last post by:
Overview: Windows 11 and 10 have less user interface control over operating system update behaviour than previous versions of Windows. In Windows 11 and 10, there is no way to turn off the Windows...
0
5562
agi2029
by: agi2029 | last post by:
Let's talk about the concept of autonomous AI software engineers and no-code agents. These AIs are designed to manage the entire lifecycle of a software development project—planning, coding, testing,...
1
4992
isladogs
by: isladogs | last post by:
The next Access Europe User Group meeting will be on Wednesday 1 May 2024 starting at 18:00 UK time (6PM UTC+1) and finishing by 19:30 (7.30PM). In this session, we are pleased to welcome a new...
0
4666
by: conductexam | last post by:
I have .net C# application in which I am extracting data from word file and save it in database particularly. To store word all data as it is I am converting the whole word file firstly in HTML and...
0
3148
by: adsilva | last post by:
A Windows Forms form does not have the event Unload, like VB6. What one acts like?
0
1495
by: 6302768590 | last post by:
Hai team i want code for transfer the data from one system to another through IP address by using C# our system has to for every 5mins then we have to update the data what the data is updated ...

By using Bytes.com and it's services, you agree to our Privacy Policy and Terms of Use.

To disable or enable advertisements and analytics tracking please visit the manage ads & tracking page.