Leaflet should easily handle stuff like this if configured correctly. OP just slaps 3000 markers in a single layer, and each of them is an image element in dom. Should probably use some marker clustering for that.