Creation of XLSX file with the streaming API is causing an enormous memory consumption
See original GitHub issueFrom what I understood, the streaming API should be an alternative for those looking to create large XLSX files with low memory consumption, correct me if I’m wrong. As it gives the user the option to commit rows to the file whenever they want to in order to release memory. But after some tests using it I’ve noticed that the enormous memory consumption I’d have with the non-streaming API is still happening. I wonder if it’s a bug or if I’m using it wrong.
Here’s a script that will reproduce the issue. Check the process memory usage, it should go up to something around 550 MB and the generated file is supposed to have something around 50 MB.
'use strict';
const Excel = require('exceljs');
function createLargeSpreadsheet() {
console.log('Creating');
const workbook = new Excel.stream.xlsx.WorkbookWriter({
filename: './test-result.xlsx',
useStyles: false,
useSharedStrings: true
});
const worksheet = workbook.addWorksheet('Data');
for (let i = 0; i < 500000; i++) {
worksheet.addRow([
i + 1,
"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla feugiat dui eu lacinia ultricies. Duis eget nibh ligula. Sed eu lobortis sapien. Aliquam sit amet nisi ligula. Proin nec dui aliquet, rhoncus felis maximus, finibus nulla. Donec id accumsan sem. Sed mollis a nunc vitae hendrerit.",
"Proin posuere dignissim tortor, non pharetra leo bibendum vitae. Vivamus luctus convallis porttitor. Vivamus ac luctus lorem. Cras laoreet augue vitae gravida facilisis. Suspendisse tempus placerat mi, nec ultrices est ultrices eget. Curabitur facilisis nunc quis lectus sodales, non ultricies urna posuere. Ut at augue vel quam vulputate bibendum. Integer dui leo, rhoncus non placerat in, elementum quis sem. Nullam egestas condimentum tempus. Maecenas pulvinar blandit nisl, at tincidunt nibh blandit id. Curabitur id libero facilisis ligula elementum egestas.",
"Nullam finibus risus at nunc scelerisque viverra. Aliquam ac enim aliquet urna fringilla pretium. Aenean vitae leo justo. Cras bibendum non urna ut malesuada. Donec at purus sed purus accumsan ornare. Mauris semper purus eget ipsum sollicitudin scelerisque. Nunc aliquet, urna quis hendrerit rutrum, eros neque interdum ante, ac pulvinar lorem nunc eu mi. Nullam convallis ut mi at volutpat. Aenean massa est, commodo non sem sit amet, imperdiet tristique dui. Proin lobortis sagittis enim, ac tincidunt tortor condimentum et.",
"In pellentesque venenatis consequat. Phasellus sed nunc eu risus porttitor sagittis quis quis odio. Nulla commodo faucibus dui, sit amet laoreet tortor bibendum in. In efficitur est ut nisi molestie gravida. Sed maximus tincidunt venenatis. Vestibulum ac tortor et ipsum dignissim rutrum. Interdum et malesuada fames ac ante ipsum primis in faucibus. Pellentesque sollicitudin mauris quis egestas tincidunt. Nam vestibulum justo sem. Nam sed ultrices velit, hendrerit ornare quam. Nunc in blandit turpis, sed tristique leo. Nulla posuere at tellus nec efficitur. Duis dapibus bibendum lacus ac accumsan. Nulla facilisi.",
"Proin elementum lectus urna, ac mattis sem consequat lobortis. Pellentesque bibendum vitae diam nec malesuada. Quisque non congue elit. Curabitur id blandit mi. Etiam felis libero, lacinia eu arcu non, congue placerat leo. Praesent nunc nisl, ultrices ac convallis id, tempus vel neque. Sed aliquet urna at nisi feugiat, vel consequat urna mattis. Mauris sapien neque, finibus non dictum nec, posuere id dui. Nulla facilisi. Phasellus laoreet ligula sit amet pulvinar mattis. Vestibulum aliquam convallis tortor a eleifend. Aliquam vel nisi in velit porttitor vestibulum. Aenean varius a mi quis dapibus.",
"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla feugiat dui eu lacinia ultricies. Duis eget nibh ligula. Sed eu lobortis sapien. Aliquam sit amet nisi ligula. Proin nec dui aliquet, rhoncus felis maximus, finibus nulla. Donec id accumsan sem. Sed mollis a nunc vitae hendrerit.",
"Proin posuere dignissim tortor, non pharetra leo bibendum vitae. Vivamus luctus convallis porttitor. Vivamus ac luctus lorem. Cras laoreet augue vitae gravida facilisis. Suspendisse tempus placerat mi, nec ultrices est ultrices eget. Curabitur facilisis nunc quis lectus sodales, non ultricies urna posuere. Ut at augue vel quam vulputate bibendum. Integer dui leo, rhoncus non placerat in, elementum quis sem. Nullam egestas condimentum tempus. Maecenas pulvinar blandit nisl, at tincidunt nibh blandit id. Curabitur id libero facilisis ligula elementum egestas.",
"Nullam finibus risus at nunc scelerisque viverra. Aliquam ac enim aliquet urna fringilla pretium. Aenean vitae leo justo. Cras bibendum non urna ut malesuada. Donec at purus sed purus accumsan ornare. Mauris semper purus eget ipsum sollicitudin scelerisque. Nunc aliquet, urna quis hendrerit rutrum, eros neque interdum ante, ac pulvinar lorem nunc eu mi. Nullam convallis ut mi at volutpat. Aenean massa est, commodo non sem sit amet, imperdiet tristique dui. Proin lobortis sagittis enim, ac tincidunt tortor condimentum et.",
"In pellentesque venenatis consequat. Phasellus sed nunc eu risus porttitor sagittis quis quis odio. Nulla commodo faucibus dui, sit amet laoreet tortor bibendum in. In efficitur est ut nisi molestie gravida. Sed maximus tincidunt venenatis. Vestibulum ac tortor et ipsum dignissim rutrum. Interdum et malesuada fames ac ante ipsum primis in faucibus. Pellentesque sollicitudin mauris quis egestas tincidunt. Nam vestibulum justo sem. Nam sed ultrices velit, hendrerit ornare quam. Nunc in blandit turpis, sed tristique leo. Nulla posuere at tellus nec efficitur. Duis dapibus bibendum lacus ac accumsan. Nulla facilisi.",
"Proin elementum lectus urna, ac mattis sem consequat lobortis. Pellentesque bibendum vitae diam nec malesuada. Quisque non congue elit. Curabitur id blandit mi. Etiam felis libero, lacinia eu arcu non, congue placerat leo. Praesent nunc nisl, ultrices ac convallis id, tempus vel neque. Sed aliquet urna at nisi feugiat, vel consequat urna mattis. Mauris sapien neque, finibus non dictum nec, posuere id dui. Nulla facilisi. Phasellus laoreet ligula sit amet pulvinar mattis. Vestibulum aliquam convallis tortor a eleifend. Aliquam vel nisi in velit porttitor vestibulum. Aenean varius a mi quis dapibus.",
"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla feugiat dui eu lacinia ultricies. Duis eget nibh ligula. Sed eu lobortis sapien. Aliquam sit amet nisi ligula. Proin nec dui aliquet, rhoncus felis maximus, finibus nulla. Donec id accumsan sem. Sed mollis a nunc vitae hendrerit.",
"Proin posuere dignissim tortor, non pharetra leo bibendum vitae. Vivamus luctus convallis porttitor. Vivamus ac luctus lorem. Cras laoreet augue vitae gravida facilisis. Suspendisse tempus placerat mi, nec ultrices est ultrices eget. Curabitur facilisis nunc quis lectus sodales, non ultricies urna posuere. Ut at augue vel quam vulputate bibendum. Integer dui leo, rhoncus non placerat in, elementum quis sem. Nullam egestas condimentum tempus. Maecenas pulvinar blandit nisl, at tincidunt nibh blandit id. Curabitur id libero facilisis ligula elementum egestas.",
"Nullam finibus risus at nunc scelerisque viverra. Aliquam ac enim aliquet urna fringilla pretium. Aenean vitae leo justo. Cras bibendum non urna ut malesuada. Donec at purus sed purus accumsan ornare. Mauris semper purus eget ipsum sollicitudin scelerisque. Nunc aliquet, urna quis hendrerit rutrum, eros neque interdum ante, ac pulvinar lorem nunc eu mi. Nullam convallis ut mi at volutpat. Aenean massa est, commodo non sem sit amet, imperdiet tristique dui. Proin lobortis sagittis enim, ac tincidunt tortor condimentum et.",
"In pellentesque venenatis consequat. Phasellus sed nunc eu risus porttitor sagittis quis quis odio. Nulla commodo faucibus dui, sit amet laoreet tortor bibendum in. In efficitur est ut nisi molestie gravida. Sed maximus tincidunt venenatis. Vestibulum ac tortor et ipsum dignissim rutrum. Interdum et malesuada fames ac ante ipsum primis in faucibus. Pellentesque sollicitudin mauris quis egestas tincidunt. Nam vestibulum justo sem. Nam sed ultrices velit, hendrerit ornare quam. Nunc in blandit turpis, sed tristique leo. Nulla posuere at tellus nec efficitur. Duis dapibus bibendum lacus ac accumsan. Nulla facilisi.",
"Proin elementum lectus urna, ac mattis sem consequat lobortis. Pellentesque bibendum vitae diam nec malesuada. Quisque non congue elit. Curabitur id blandit mi. Etiam felis libero, lacinia eu arcu non, congue placerat leo. Praesent nunc nisl, ultrices ac convallis id, tempus vel neque. Sed aliquet urna at nisi feugiat, vel consequat urna mattis. Mauris sapien neque, finibus non dictum nec, posuere id dui. Nulla facilisi. Phasellus laoreet ligula sit amet pulvinar mattis. Vestibulum aliquam convallis tortor a eleifend. Aliquam vel nisi in velit porttitor vestibulum. Aenean varius a mi quis dapibus.",
"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla feugiat dui eu lacinia ultricies. Duis eget nibh ligula. Sed eu lobortis sapien. Aliquam sit amet nisi ligula. Proin nec dui aliquet, rhoncus felis maximus, finibus nulla. Donec id accumsan sem. Sed mollis a nunc vitae hendrerit.",
"Proin posuere dignissim tortor, non pharetra leo bibendum vitae. Vivamus luctus convallis porttitor. Vivamus ac luctus lorem. Cras laoreet augue vitae gravida facilisis. Suspendisse tempus placerat mi, nec ultrices est ultrices eget. Curabitur facilisis nunc quis lectus sodales, non ultricies urna posuere. Ut at augue vel quam vulputate bibendum. Integer dui leo, rhoncus non placerat in, elementum quis sem. Nullam egestas condimentum tempus. Maecenas pulvinar blandit nisl, at tincidunt nibh blandit id. Curabitur id libero facilisis ligula elementum egestas.",
"Nullam finibus risus at nunc scelerisque viverra. Aliquam ac enim aliquet urna fringilla pretium. Aenean vitae leo justo. Cras bibendum non urna ut malesuada. Donec at purus sed purus accumsan ornare. Mauris semper purus eget ipsum sollicitudin scelerisque. Nunc aliquet, urna quis hendrerit rutrum, eros neque interdum ante, ac pulvinar lorem nunc eu mi. Nullam convallis ut mi at volutpat. Aenean massa est, commodo non sem sit amet, imperdiet tristique dui. Proin lobortis sagittis enim, ac tincidunt tortor condimentum et.",
"In pellentesque venenatis consequat. Phasellus sed nunc eu risus porttitor sagittis quis quis odio. Nulla commodo faucibus dui, sit amet laoreet tortor bibendum in. In efficitur est ut nisi molestie gravida. Sed maximus tincidunt venenatis. Vestibulum ac tortor et ipsum dignissim rutrum. Interdum et malesuada fames ac ante ipsum primis in faucibus. Pellentesque sollicitudin mauris quis egestas tincidunt. Nam vestibulum justo sem. Nam sed ultrices velit, hendrerit ornare quam. Nunc in blandit turpis, sed tristique leo. Nulla posuere at tellus nec efficitur. Duis dapibus bibendum lacus ac accumsan. Nulla facilisi.",
"Proin elementum lectus urna, ac mattis sem consequat lobortis. Pellentesque bibendum vitae diam nec malesuada. Quisque non congue elit. Curabitur id blandit mi. Etiam felis libero, lacinia eu arcu non, congue placerat leo. Praesent nunc nisl, ultrices ac convallis id, tempus vel neque. Sed aliquet urna at nisi feugiat, vel consequat urna mattis. Mauris sapien neque, finibus non dictum nec, posuere id dui. Nulla facilisi. Phasellus laoreet ligula sit amet pulvinar mattis. Vestibulum aliquam convallis tortor a eleifend. Aliquam vel nisi in velit porttitor vestibulum. Aenean varius a mi quis dapibus.",
"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla feugiat dui eu lacinia ultricies. Duis eget nibh ligula. Sed eu lobortis sapien. Aliquam sit amet nisi ligula. Proin nec dui aliquet, rhoncus felis maximus, finibus nulla. Donec id accumsan sem. Sed mollis a nunc vitae hendrerit.",
"Proin posuere dignissim tortor, non pharetra leo bibendum vitae. Vivamus luctus convallis porttitor. Vivamus ac luctus lorem. Cras laoreet augue vitae gravida facilisis. Suspendisse tempus placerat mi, nec ultrices est ultrices eget. Curabitur facilisis nunc quis lectus sodales, non ultricies urna posuere. Ut at augue vel quam vulputate bibendum. Integer dui leo, rhoncus non placerat in, elementum quis sem. Nullam egestas condimentum tempus. Maecenas pulvinar blandit nisl, at tincidunt nibh blandit id. Curabitur id libero facilisis ligula elementum egestas.",
"Nullam finibus risus at nunc scelerisque viverra. Aliquam ac enim aliquet urna fringilla pretium. Aenean vitae leo justo. Cras bibendum non urna ut malesuada. Donec at purus sed purus accumsan ornare. Mauris semper purus eget ipsum sollicitudin scelerisque. Nunc aliquet, urna quis hendrerit rutrum, eros neque interdum ante, ac pulvinar lorem nunc eu mi. Nullam convallis ut mi at volutpat. Aenean massa est, commodo non sem sit amet, imperdiet tristique dui. Proin lobortis sagittis enim, ac tincidunt tortor condimentum et.",
"In pellentesque venenatis consequat. Phasellus sed nunc eu risus porttitor sagittis quis quis odio. Nulla commodo faucibus dui, sit amet laoreet tortor bibendum in. In efficitur est ut nisi molestie gravida. Sed maximus tincidunt venenatis. Vestibulum ac tortor et ipsum dignissim rutrum. Interdum et malesuada fames ac ante ipsum primis in faucibus. Pellentesque sollicitudin mauris quis egestas tincidunt. Nam vestibulum justo sem. Nam sed ultrices velit, hendrerit ornare quam. Nunc in blandit turpis, sed tristique leo. Nulla posuere at tellus nec efficitur. Duis dapibus bibendum lacus ac accumsan. Nulla facilisi.",
"Proin elementum lectus urna, ac mattis sem consequat lobortis. Pellentesque bibendum vitae diam nec malesuada. Quisque non congue elit. Curabitur id blandit mi. Etiam felis libero, lacinia eu arcu non, congue placerat leo. Praesent nunc nisl, ultrices ac convallis id, tempus vel neque. Sed aliquet urna at nisi feugiat, vel consequat urna mattis. Mauris sapien neque, finibus non dictum nec, posuere id dui. Nulla facilisi. Phasellus laoreet ligula sit amet pulvinar mattis. Vestibulum aliquam convallis tortor a eleifend. Aliquam vel nisi in velit porttitor vestibulum. Aenean varius a mi quis dapibus."
]).commit();
if (i % 50000 === 0) {
console.log(i);
}
}
worksheet.commit();
console.log('Worksheet created')
workbook.commit().then(() => {
console.log('Finished');
}).catch((error) => {
console.error(error);
});
}
createLargeSpreadsheet();
Issue Analytics
- State:
- Created 7 years ago
- Reactions:2
- Comments:8
Top Results From Across the Web
OutOfMemory exception while working with XLSX files on Mule 4
x runtimes is not optimized for bigger files, and it consumes a lot of memory, so big XLSX files could easily trigger the...
Read more >c# - 'OutOfMemoryException' reading 20mb XLSX file
However, for any XLSX file larger than a few megabytes, it causes memory usage to shot up to about 1GB and eventually throw...
Read more >Resolve OutOfMemoryError With Excel Export in the Apache ...
To resolve the memory issues and performance issues of Excel exports, they have utilized a stream API to design to support large data...
Read more >20^20 hidden cells in a .xlsx file causes heap memory full ...
Created attachment 35196 [details] File which causes heap memory out An .xlsx file has only one cell filled but all other cells are...
Read more >Cannot read really big excel file · Issue #95 - GitHub
Hi guys, I've generated .xlsx file with apache poi SXSSF number of sheets : 1; number of rows: 1 million; number of cells...
Read more >Top Related Medium Post
No results found
Top Related StackOverflow Question
No results found
Troubleshoot Live Code
Lightrun enables developers to add logs, metrics and snapshots to live code - no restarts or redeploys required.
Start FreeTop Related Reddit Thread
No results found
Top Related Hackernoon Post
No results found
Top Related Tweet
No results found
Top Related Dev.to Post
No results found
Top Related Hashnode Post
No results found
Top GitHub Comments
Has there been any update on this? We are running into exact same problems mentioned here.
@zignd I actually got it to work. Didnt realize that I had to
workbook.commit()
as well, I only didworksheet.commit()
because I’m really new to the Streaming API. I’m used to using the file writing methodRegarding to your question, I suppose it’s actually better to just use Streaming API over writing file method for larger Excel file. After reading a lot issues on github, I read that @guyonroche actually said that he’s facing the same problem. That there’s an issue in high memory usage and he’s still working on it. He said this in 2016 though, I’m not really sure how far he’s gotten or if he’s going to commit new stuff at all