.each_row_streaming will not avoid .parse if other methods like sheet.info are used. This is not always obvious. Can you edit the Readme section about streaming with a list of any methods that will cause a .parse()? I was using .info in a logging call and it would parse the entire sheet just for the .info information. Once I remove that logging call I had JUST streaming of rows and my memory foot print went to almost nothing. And my server was no longer choking on a 2.5MB excel file with 100,000 blank rows (a common issue when people copy/paste into spreadsheets in Excel).