You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@openoffice.apache.org by le...@apache.org on 2012/09/07 11:47:01 UTC
svn commit: r1381965 - in /incubator/ooo/trunk/main/sc/source/filter:
excel/read.cxx excel/xipivot.cxx inc/xipivot.hxx
Author: leiw
Date: Fri Sep 7 09:47:01 2012
New Revision: 1381965
URL: http://svn.apache.org/viewvc?rev=1381965&view=rev
Log:
#i120839 [From Symphony]It costs too much memory to open a large spreadsheet file containing pivot tables
Patch by: Clarence GUO
Review by: Wang Lei
Modified:
incubator/ooo/trunk/main/sc/source/filter/excel/read.cxx
incubator/ooo/trunk/main/sc/source/filter/excel/xipivot.cxx
incubator/ooo/trunk/main/sc/source/filter/inc/xipivot.hxx
Modified: incubator/ooo/trunk/main/sc/source/filter/excel/read.cxx
URL: http://svn.apache.org/viewvc/incubator/ooo/trunk/main/sc/source/filter/excel/read.cxx?rev=1381965&r1=1381964&r2=1381965&view=diff
==============================================================================
--- incubator/ooo/trunk/main/sc/source/filter/excel/read.cxx (original)
+++ incubator/ooo/trunk/main/sc/source/filter/excel/read.cxx Fri Sep 7 09:47:01 2012
@@ -19,13 +19,9 @@
*
*************************************************************/
-
-
// MARKER(update_precomp.py): autogen include statement, do not remove
#include "precompiled_sc.hxx"
-
-
//------------------------------------------------------------------------
#include <stdlib.h>
@@ -1017,7 +1013,7 @@ FltError ImportExcel8::Read( void )
{
rNumFmtBfr.CreateScFormats();
rXFBfr.CreateUserStyles();
- rPTableMgr.ReadPivotCaches( maStrm );
+ //rPTableMgr.ReadPivotCaches( maStrm );
eAkt = EXC_STATE_BEFORE_SHEET;
}
break;
@@ -1203,8 +1199,15 @@ FltError ImportExcel8::Read( void )
// #i45843# Convert pivot tables before calculation, so they are available
// for the GETPIVOTDATA function.
if( GetBiff() == EXC_BIFF8 )
- GetPivotTableManager().ConvertPivotTables();
+// GetPivotTableManager().ConvertPivotTables();
+ {
+ SCTAB nTabCount = GetDoc().GetTableCount();
+
+ GetPivotTableManager().ConvertPivotTables( maStrm );
+ for( SCTAB nDummyTab = GetDoc().GetTableCount() - 1; nDummyTab >= nTabCount; nDummyTab-- )
+ GetDoc().DeleteTab( nDummyTab );
+ }
pProgress.reset();
if (pD->IsAdjustHeightEnabled())
@@ -1226,8 +1229,9 @@ FltError ImportExcel8::Read( void )
else if( rAddrConv.IsColTruncated() )
eLastErr = SCWARN_IMPORT_COLUMN_OVERFLOW;
- if( GetBiff() == EXC_BIFF8 )
- GetPivotTableManager().MaybeRefreshPivotTables();
+// Refreshing pivot tables moves to the end of converting every table
+// if( GetBiff() == EXC_BIFF8 )
+// GetPivotTableManager().MaybeRefreshPivotTables();
}
return eLastErr;
Modified: incubator/ooo/trunk/main/sc/source/filter/excel/xipivot.cxx
URL: http://svn.apache.org/viewvc/incubator/ooo/trunk/main/sc/source/filter/excel/xipivot.cxx?rev=1381965&r1=1381964&r2=1381965&view=diff
==============================================================================
--- incubator/ooo/trunk/main/sc/source/filter/excel/xipivot.cxx (original)
+++ incubator/ooo/trunk/main/sc/source/filter/excel/xipivot.cxx Fri Sep 7 09:47:01 2012
@@ -19,8 +19,6 @@
*
*************************************************************/
-
-
// MARKER(update_precomp.py): autogen include statement, do not remove
#include "precompiled_sc.hxx"
@@ -1420,6 +1418,8 @@ void XclImpPivotTable::Convert()
mpDPObj = pDPObj;
ApplyMergeFlags(aOutRange, aSaveData);
+ MaybeRefresh(); // refresh after convert immediately
+ mxPCache = XclImpPivotCacheRef(); // release memory
}
void XclImpPivotTable::MaybeRefresh()
@@ -1612,23 +1612,48 @@ void XclImpPivotTableManager::ReadSxView
// ----------------------------------------------------------------------------
-void XclImpPivotTableManager::ReadPivotCaches( XclImpStream& rStrm )
+// Reading all used pivot caches at one time and then converting all pivot tables together will consume too much memory, forbid this action
+// ConvertPivotTables will change to read cache one by one and convert it then release the memory
+/*void XclImpPivotTableManager::ReadPivotCaches( XclImpStream& rStrm )
{
for( XclImpPivotCacheVec::iterator aIt = maPCaches.begin(), aEnd = maPCaches.end(); aIt != aEnd; ++aIt )
(*aIt)->ReadPivotCacheStream( rStrm );
-}
+}*/
-void XclImpPivotTableManager::ConvertPivotTables()
+void XclImpPivotTableManager::ConvertPivotTables( XclImpStream & rStm/* guoyanp: for DP memory */ )
{
+// for( XclImpPivotTableVec::iterator aIt = maPTables.begin(), aEnd = maPTables.end(); aIt != aEnd; ++aIt )
+// (*aIt)->Convert();
+
+ std::map< sal_uInt16, std::list< XclImpPivotTableRef > > aMap;
+
for( XclImpPivotTableVec::iterator aIt = maPTables.begin(), aEnd = maPTables.end(); aIt != aEnd; ++aIt )
- (*aIt)->Convert();
+ aMap[(*aIt)->GetCacheId()].push_back( *aIt );
+
+ size_t iCache = 0;
+
+ for( std::map< sal_uInt16, std::list< XclImpPivotTableRef > >::iterator i = aMap.begin(); i != aMap.end(); i++, iCache++ )
+ {
+ if( i->first >= maPCaches.size() ) continue;
+
+ maPCaches[iCache]->ReadPivotCacheStream( rStm );
+
+ for( std::list< XclImpPivotTableRef >::iterator j = i->second.begin(); j != i->second.end(); j++ )
+ (*j)->Convert();
+
+ maPCaches[iCache] = XclImpPivotCacheRef();
+ }
}
-void XclImpPivotTableManager::MaybeRefreshPivotTables()
+// Reading all used pivot caches at one time and then converting all pivot tables together will consume too much memory, forbid that action
+// ConvertPivotTables will change to read cache one by one and convert it then release the memory
+// So refreshing all pivot tables at one time is forbidden too because the cache already released
+// Need to refresh one by one after convert every pivot table
+/*void XclImpPivotTableManager::MaybeRefreshPivotTables()
{
for( XclImpPivotTableVec::iterator aIt = maPTables.begin(), aEnd = maPTables.end(); aIt != aEnd; ++aIt )
(*aIt)->MaybeRefresh();
-}
+}*/
// ============================================================================
Modified: incubator/ooo/trunk/main/sc/source/filter/inc/xipivot.hxx
URL: http://svn.apache.org/viewvc/incubator/ooo/trunk/main/sc/source/filter/inc/xipivot.hxx?rev=1381965&r1=1381964&r2=1381965&view=diff
==============================================================================
--- incubator/ooo/trunk/main/sc/source/filter/inc/xipivot.hxx (original)
+++ incubator/ooo/trunk/main/sc/source/filter/inc/xipivot.hxx Fri Sep 7 09:47:01 2012
@@ -19,8 +19,6 @@
*
*************************************************************/
-
-
#ifndef SC_XIPIVOT_HXX
#define SC_XIPIVOT_HXX
@@ -358,6 +356,8 @@ public:
void ApplyMergeFlags(const ScRange& rOutRange, const ScDPSaveData& rSaveData);
+ sal_uInt16 GetCacheId() const { return maPTInfo.mnCacheIdx; };
+
// ------------------------------------------------------------------------
private:
typedef ::std::vector< XclImpPTFieldRef > XclImpPTFieldVec;
@@ -433,11 +433,11 @@ public:
// ------------------------------------------------------------------------
/** Reads all used pivot caches and creates additional sheets for external data sources. */
- void ReadPivotCaches( XclImpStream& rStrm );
+// void ReadPivotCaches( XclImpStream& rStrm );
/** Inserts all pivot tables into the Calc document. */
- void ConvertPivotTables();
-
- void MaybeRefreshPivotTables();
+// void ConvertPivotTables();
+ void ConvertPivotTables( XclImpStream & );
+// void MaybeRefreshPivotTables();
private:
typedef ::std::vector< XclImpPivotCacheRef > XclImpPivotCacheVec;