我需要处理大Excel
个文件。我的问题是heap space
,特别是XLS
格式。即使我有一个Apsose LighCells
API来按顺序解析它,我也需要从数据库中检索文件。
到目前为止,我将数据库中的文件放在40kb的块中。我有一个Import
表(存储与导入相关的一般信息,例如开始和结束时间,数据类型等)和一个ImportData
表(包含数据块作为blob)。我在Import
和ImportData
之间存在一对多的关系:
<hibernate-mapping> <class name="com.company.import.pojos.Import
table="IMPORT_TABLE">
<id name="id" type="integer">
<column name="ID" />
<generator class="some.id.generator.IdGenerator"></generator>
</id>
<property name="startTime" type="timestamp">
<column name="START" />
</property>
<property name="endTime" type="timestamp">
<column name="END" />
</property>
<property lazy="false" name="datatzpe" type="com.company.import.enums.ImportDataType">
<column name="DATATYPE" />
</property>
<bag name="importDataList" table="IMPORT_DATA" lazy="true" cascade="all" inverse="false">
<key column="IMPORT_TABLE_ID"/>
<one-to-many class="com.company.import.pojos.ImportData"/>
</bag>
</class> </hibernate-mapping>
<hibernate-mapping> <class
name="com.company.import.pojos.ImportData" table="IMPORT_DATA">
<id name="id" type="integer">
<column name="ID" />
<generator class="some.id.generator.IdGenerator"></generator>
</id>
<property name="importTableID" type="integer">
<column name="IMPORT_TABLE_ID" />
</property>
<property name="data" type="binary">
<column name="DATA" />
</property>
<property name="order" type="integer">
<column name="ORDER" />
</property> </class> </hibernate-mapping>
我使用Hibernate (4.2.3.Final)
,但即使lazy loading
也不是一个选项,因为那样我将在内存中拥有ImportData
个对象的完整列表,这就是为什么我得到一个OutOfMemoryError而我想要避免这样做。
提供更多内存不是一个选项(应用程序也运行在运行其他应用程序的容器上,并且多个用户可能同时处理文件,因此最终会发生堆空间问题),因此我正在寻找一种方法始终读取下一个数据块并将其提供给Aspose API
的流。
我在Aspose中创建我的工作簿就像这样:
InputStream inStream = ....;// get the input stream somehow
Workbook workbook = new Workbook(inStream);
答案 0 :(得分:1)
您可能需要实现自己的InputStream,它将多个IS作为一个处理,处理当您到达一个IS的末尾时,关闭它并选择下一个以填充读取缓冲区的其余部分。
我不知道这种行为的任何实现。
你的档案有多大?