In python è così, se mi dai qualche minuto provo a farlo anche in Java.
Stiamo parlando di circa 9000 numeri eh...
Il tuo problema con la memoria è che cerchi di generare prima tutti i numeri e poi applicare il crivello, mai n pratica basta applicare il crivello dinamicamente
Codice:
def eratostene(n):
buffer = []
flag = False
for x in range(2,n):
flag = False
if x*x > n:
break
for y in buffer:
if x%y == 0:
flag = True
break
if not flag:
buffer.append(x)
return buffer
print(eratostene(8000000000))
a = input()