Selaa lähdekoodia

generateImages_browserless: await instead of .then to free up memory for potential rerenders

inside the .then, memory will not be freed up,
so if you rerender multiple times within the .then block, memory usage will constantly grow.
sschmid 4 vuotta sitten
vanhempi
commit
945057193b
1 muutettua tiedostoa jossa 52 lisäystä ja 55 poistoa
  1. 52 55
      test/Util/generateImages_browserless.js

+ 52 - 55
test/Util/generateImages_browserless.js

@@ -265,65 +265,62 @@ async function generateSampleImage (sampleFilename, directory, osmdInstance, osm
         osmdInstance.drawBottomLine = includeSkyBottomLine
     }
 
-    osmdInstance.load(loadParameter).then(function () {
-        debug('xml loaded', DEBUG)
-        try {
-            osmdInstance.render()
-        } catch (ex) {
-            console.log('renderError: ' + ex)
-        }
-        debug('rendered', DEBUG)
+    await osmdInstance.load(loadParameter) // if using load.then() without await, memory will not be freed up between renders
+    debug('xml loaded', DEBUG)
+    try {
+        osmdInstance.render()
+    } catch (ex) {
+        console.log('renderError: ' + ex)
+    }
+    debug('rendered', DEBUG)
 
-        const dataUrls = []
-        let canvasImage
+    const dataUrls = []
+    let canvasImage
 
-        for (let pageNumber = 1; pageNumber < 999; pageNumber++) {
-            canvasImage = document.getElementById('osmdCanvasVexFlowBackendCanvas' + pageNumber)
-            if (!canvasImage) {
-                break
-            }
-            if (!canvasImage.toDataURL) {
-                console.log(`error: could not get canvas image for page ${pageNumber} for file: ${sampleFilename}`)
-                break
-            }
-            dataUrls.push(canvasImage.toDataURL())
+    for (let pageNumber = 1; pageNumber < 999; pageNumber++) {
+        canvasImage = document.getElementById('osmdCanvasVexFlowBackendCanvas' + pageNumber)
+        if (!canvasImage) {
+            break
         }
-        for (let urlIndex = 0; urlIndex < dataUrls.length; urlIndex++) {
-            const pageNumberingString = `${urlIndex + 1}`
-            const skybottomlineString = includeSkyBottomLine ? 'skybottomline_' : ''
-            // pageNumberingString = dataUrls.length > 0 ? pageNumberingString : '' // don't put '_1' at the end if only one page. though that may cause more work
-            var pageFilename = `${imageDir}/${sampleFilename}_${skybottomlineString}${pageNumberingString}.png`
-
-            const dataUrl = dataUrls[urlIndex]
-            if (!dataUrl || !dataUrl.split) {
-                console.log(`error: could not get dataUrl (imageData) for page ${urlIndex + 1} of sample: ${sampleFilename}`)
-                continue
-            }
-            const imageData = dataUrl.split(';base64,').pop()
-            const imageBuffer = Buffer.from(imageData, 'base64')
-
-            debug('got image data, saving to: ' + pageFilename, DEBUG)
-            FS.writeFileSync(pageFilename, imageBuffer, { encoding: 'base64' })
-
-            // debug: log memory usage
-            // const usage = process.memoryUsage()
-            // for (const entry of Object.entries(usage)) {
-            //     if (entry[0] === 'rss') {
-            //         if (entry[1] > maxRss) {
-            //             maxRss = entry[1]
-            //             maxRssFilename = pageFilename
-            //         }
-            //     }
-            //     console.log(entry[0] + ': ' + entry[1] / (1024 * 1024) + 'mb')
-            // }
-            // console.log('maxRss: ' + (maxRss / 1024 / 1024) + 'mb' + ' for ' + maxRssFilename)
+        if (!canvasImage.toDataURL) {
+            console.log(`error: could not get canvas image for page ${pageNumber} for file: ${sampleFilename}`)
+            break
+        }
+        dataUrls.push(canvasImage.toDataURL())
+    }
+    for (let urlIndex = 0; urlIndex < dataUrls.length; urlIndex++) {
+        const pageNumberingString = `${urlIndex + 1}`
+        const skybottomlineString = includeSkyBottomLine ? 'skybottomline_' : ''
+        // pageNumberingString = dataUrls.length > 0 ? pageNumberingString : '' // don't put '_1' at the end if only one page. though that may cause more work
+        var pageFilename = `${imageDir}/${sampleFilename}_${skybottomlineString}${pageNumberingString}.png`
+
+        const dataUrl = dataUrls[urlIndex]
+        if (!dataUrl || !dataUrl.split) {
+            console.log(`error: could not get dataUrl (imageData) for page ${urlIndex + 1} of sample: ${sampleFilename}`)
+            continue
         }
-        // console.log('maxRss total: ' + (maxRss / 1024 / 1024) + 'mb' + ' for ' + maxRssFilename)
-    }) // end render then
-    //     },
-    //     function (e) {
-    //         console.log('error while rendering: ' + e)
-    //     }) // end load then
+        const imageData = dataUrl.split(';base64,').pop()
+        const imageBuffer = Buffer.from(imageData, 'base64')
+
+        debug('got image data, saving to: ' + pageFilename, DEBUG)
+        FS.writeFileSync(pageFilename, imageBuffer, { encoding: 'base64' })
+
+        // debug: log memory usage
+        // const usage = process.memoryUsage()
+        // for (const entry of Object.entries(usage)) {
+        //     if (entry[0] === 'rss') {
+        //         if (entry[1] > maxRss) {
+        //             maxRss = entry[1]
+        //             maxRssFilename = pageFilename
+        //         }
+        //     }
+        //     console.log(entry[0] + ': ' + entry[1] / (1024 * 1024) + 'mb')
+        // }
+        // console.log('maxRss: ' + (maxRss / 1024 / 1024) + 'mb' + ' for ' + maxRssFilename)
+    }
+    // console.log('maxRss total: ' + (maxRss / 1024 / 1024) + 'mb' + ' for ' + maxRssFilename)
+
+    // await sleep(5000)
     // }) // end read file
 }