Нашел ответ:
self.icdDataView.setModel(mdl)
self.icdDataView.setColumnHidden(0, True)
self.icdDataView.horizontalHeader().setStretchLastSection(False)
self.icdDataView.setColumnWidth(1, 100)
self.icdDataView.setColumnWidth(3, 100)
self.icdDataView.horizontalHeader().setSectionResizeMode(2, QHeaderView.Stretch)
self.icdDataView.selectRow(0)
Разница заключается в том, что в первом фрагменте кода запрашивается один большой блок памяти с размером 524288 * 524288 * sizeof (int). Во втором код запрашивает один блок размером 524288 * sizeof (int *) и 524288 блоков размером 524288 * sizeof (int).
Меньшие блоки, как правило, проще, с точки зрения управления памятью, потому что они легче помещаются между блоками, которые уже были выделены. Это то, что в комментариях называется «фрагментация кучи» - когда программа выделяет кучу блоков и освобождает некоторые из них, освобожденные блоки распределяются между блоками, которые не были освобождены. Выделение большого блока может затем потерпеть неудачу, если ни один из освобожденных блоков не будет достаточно большим для этого блока, в то время как группа меньших выделений может быть успешной, даже если объем памяти, выделенный для меньших блоков, больше, чем отказавший большой блок.