Если рендеринг сразу большого количества данных является чрезмерным, я думаю, что было бы лучше разделить данные на куски и асинхронно визуализировать каждый кусок.
Например.
function chunk(arr, chunkSize) {
var R = [];
for (var i=0,len=arr.length; i<len; i+=chunkSize)
R.push(arr.slice(i,i+chunkSize));
return R;
}
var bigData = [...],
reasonableNumber = 20;
chunk(bigData, reasonableNumber).forEach((splitted) => {
requestAnimationFrame(() => drawWithD3(splitted));
});
Надеюсь, это сработает.