If you are simply interested in plotting the data then any data reduction technique would do,even if it appears to be crude.
Effectively, the plotting function itself will not plot all the data, because the space assigned to the plot has a finite number of $N_x \times N_y$ pixels assigned to it. For example, if your plotting area was $1024 \times 768$, then any waveform with more than 1024 samples would need to somehow be re-scaled or re-sampled. Plotting functions do that internally anyway but always retain a link to the original data to do the whole process again, usually
What you could try to do is to resample your waveform and specifically downsample it.
Downsampling is composed of two steps: The step of anti-alias filtering and the step of decimation.
If you are purely interested in plotting a waveform, you can try to simply decimate it with a low factor (say, retaining 1 sample out of every 5) and then send it for plotting. It will still have more data than required by the plot but it will be of more manageable size.
The reason for opting for pure decimation here is because the filtering step (although necessary) can be costly (in terms of computation) and take a bit longer. If you can afford the filtering time however, I would suggest that you do a proper downsampling.
If you are using Python, you can try this function (or this one) to handle the downsampling step.
It goes without saying here that if you wish to process the signal further, you must downsample it properly.
Finally, another reason why you are running out of memory might be the fact that you are retaining all data in memory even when you are done using it. Therefore, once you have sent a waveform for plotting, try
del()eting it, possibly followed by
gc.collect() to ensure that that part of memory will become immediately available.
Hope this helps.