Pickle попытается проанализировать все ваши данные и, вероятно, преобразовать их в промежуточные состояния, прежде чем записывать все на диск - поэтому, если вы используете примерно половину доступной памяти, она взорвется.
Поскольку ваши данные уже есть в списке, существует простой способ обойти каждый массив и сохранить его, вместо того, чтобы сериализовать 20000 массивов за один раз:
with open('all_data.data', 'wb') as f:
for item in data:
pickle.dump(item, f)
Затем, чтобы прочитать его, просто продолжайте извлекать объекты из файла и добавлять его в список, пока файл не будет исчерпан:
data = []
with open('all_data.data', 'rb') as f:
while True:
try:
data.append(pickle.load(f))
except EOFError:
break
Это работает, потому что отмена выбора из файла ведется довольно хорошо: указатель файла остается точно в том месте, где заканчивается консервированный объект, сохраненный в файле - поэтому дальнейшие чтения начинаются с начала следующего объекта.