summaryrefslogtreecommitdiff
path: root/sax
diff options
context:
space:
mode:
authorMatúš Kukan <matus.kukan@collabora.com>2014-09-25 14:45:55 +0200
committerMatúš Kukan <matus.kukan@collabora.com>2014-10-23 11:53:15 +0200
commitcc3ac382a2827a42d45f3fcb5e2149c163667ba0 (patch)
treeb4c7fd6c7fb0f86b32a495bffb1200f804c2ef83 /sax
parent8cc5b621aa308de2272bed32bc8cd88626455831 (diff)
FastSerializer: Do not keep whole sequence in memory; write in chunks
Change-Id: Ibca65a2b8397358ac4013c8e5b53389ac6949e4d
Diffstat (limited to 'sax')
-rw-r--r--sax/source/tools/fastserializer.cxx19
-rw-r--r--sax/source/tools/fastserializer.hxx2
2 files changed, 17 insertions, 4 deletions
diff --git a/sax/source/tools/fastserializer.cxx b/sax/source/tools/fastserializer.cxx
index dfa37c7434f4..d85bfefd700a 100644
--- a/sax/source/tools/fastserializer.cxx
+++ b/sax/source/tools/fastserializer.cxx
@@ -53,8 +53,8 @@ using ::com::sun::star::io::BufferSizeExceededException;
namespace sax_fastparser {
FastSaxSerializer::FastSaxSerializer( )
- : maOutputData()
- , maOutputStream(maOutputData)
+ : maOutputData(0x4000)
+ , maOutputStream(maOutputData, 1.3, 0x1000, 0x4000)
, mxOutputStream()
, mxFastTokenHandler()
, maMarkStack()
@@ -298,7 +298,7 @@ namespace sax_fastparser {
if ( maMarkStack.size() == 1 && eMergeType != MERGE_MARKS_IGNORE)
{
- maOutputStream.writeBytes( maMarkStack.top()->getData() );
+ writeOutput( maMarkStack.top()->getData() );
maMarkStack.pop();
return;
}
@@ -319,11 +319,22 @@ namespace sax_fastparser {
void FastSaxSerializer::writeBytes( const Sequence< ::sal_Int8 >& aData ) throw ( NotConnectedException, BufferSizeExceededException, IOException, RuntimeException )
{
if ( maMarkStack.empty() )
- maOutputStream.writeBytes( aData );
+ writeOutput( aData );
else
maMarkStack.top()->append( aData );
}
+ void FastSaxSerializer::writeOutput( const Sequence< ::sal_Int8 >& aData ) throw ( NotConnectedException, BufferSizeExceededException, IOException, RuntimeException )
+ {
+ maOutputStream.writeBytes( aData );
+ // Write when the sequence gets big enough
+ if (maOutputStream.getSize() > 0x10000)
+ {
+ maOutputStream.flush();
+ mxOutputStream->writeBytes(maOutputData);
+ }
+ }
+
FastSaxSerializer::Int8Sequence& FastSaxSerializer::ForMerge::getData()
{
merge( maData, maPostponed, true );
diff --git a/sax/source/tools/fastserializer.hxx b/sax/source/tools/fastserializer.hxx
index 147d7671d160..45535f25b74f 100644
--- a/sax/source/tools/fastserializer.hxx
+++ b/sax/source/tools/fastserializer.hxx
@@ -217,6 +217,8 @@ private:
void writeFastAttributeList( const ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XFastAttributeList >& Attribs );
void write( const OUString& s );
+ void writeOutput( const css::uno::Sequence< ::sal_Int8 >& aData )
+ throw (css::io::NotConnectedException, css::io::BufferSizeExceededException, css::io::IOException, css::uno::RuntimeException);
protected:
rtl::ByteSequence maClosingBracket;