From 27a482d329a4aaa9fdb4a98d987aa3ebf753926d Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Sat, 16 Jul 2011 11:17:42 -0600 Subject: [PATCH] MOBI Output: Do not keep all images in memory during the conversion. Fixes #810801 (Private bug) --- src/calibre/ebooks/conversion/plumber.py | 1 + src/calibre/ebooks/mobi/writer.py | 2 ++ src/calibre/ebooks/oeb/base.py | 15 +++++++++++---- 3 files changed, 14 insertions(+), 4 deletions(-) diff --git a/src/calibre/ebooks/conversion/plumber.py b/src/calibre/ebooks/conversion/plumber.py index 3a82cd56ca..cee24521c7 100644 --- a/src/calibre/ebooks/conversion/plumber.py +++ b/src/calibre/ebooks/conversion/plumber.py @@ -1055,6 +1055,7 @@ OptionRecommendation(name='sr3_replace', with self.output_plugin: self.output_plugin.convert(self.oeb, self.output, self.input_plugin, self.opts, self.log) + self.oeb.clean_temp_files() self.ui_reporter(1.) run_plugins_on_postprocess(self.output, self.output_fmt) diff --git a/src/calibre/ebooks/mobi/writer.py b/src/calibre/ebooks/mobi/writer.py index bf9de37513..c1cde59718 100644 --- a/src/calibre/ebooks/mobi/writer.py +++ b/src/calibre/ebooks/mobi/writer.py @@ -1325,6 +1325,8 @@ class MobiWriter(object): except: self._oeb.logger.warn('Bad image file %r' % item.href) continue + finally: + item.unload_data_from_memory() self._records.append(data) if self._first_image_record is None: self._first_image_record = len(self._records)-1 diff --git a/src/calibre/ebooks/oeb/base.py b/src/calibre/ebooks/oeb/base.py index d75620adbd..fb1910d717 100644 --- a/src/calibre/ebooks/oeb/base.py +++ b/src/calibre/ebooks/oeb/base.py @@ -1180,8 +1180,9 @@ class Manifest(object): if memory is None: from calibre.ptempfile import PersistentTemporaryFile pt = PersistentTemporaryFile(suffix='_oeb_base_mem_unloader.img') - pt.write(self._data) - pt.close() + with pt: + pt.write(self._data) + self.oeb._temp_files.append(pt.name) def loader(*args): with open(pt.name, 'rb') as f: ans = f.read() @@ -1196,8 +1197,6 @@ class Manifest(object): self._loader = loader2 self._data = None - - def __str__(self): data = self.data if isinstance(data, etree._Element): @@ -1913,6 +1912,14 @@ class OEBBook(object): self.toc = TOC() self.pages = PageList() self.auto_generated_toc = True + self._temp_files = [] + + def clean_temp_files(self): + for path in self._temp_files: + try: + os.remove(path) + except: + pass @classmethod def generate(cls, opts):