2009-11-16 38 views

risposta

73

Con un'installazione Python a 64 bit, e (diciamo) 64 GB di memoria, una stringa Python 2 di circa 63 GB dovrebbero essere abbastanza fattibili (se non al massimo veloce). Se è possibile aggiornare la memoria molto oltre (che ti costerà un braccio e una gamba, ovviamente), le tue stringhe massime possibili dovrebbero essere proporzionalmente più lunghe. (Non consiglio di fare affidamento sulla memoria virtuale per estenderlo di molto, altrimenti i tuoi runtime saranno semplicemente ridicoli ;-).

Con una tipica installazione Python a 32 bit, ovviamente, la memoria totale che è possibile utilizzare nell'applicazione è limitata a qualcosa come 2 o 3 GB (a seconda del sistema operativo e della configurazione), quindi le stringhe più lunghe che è possibile utilizzare essere molto più piccolo rispetto alle installazioni a 64 bit con quantità di RAM ridicolmente elevate.

+26

Vado a provarlo su una macchina con 128 GB. –

+2

E? ... e? @AlexMartelli, stiamo aspettando di sapere cosa è successo ... – Mawg

+1

@Mawg, sembra che potresti voler chiedere a Carl F.! –

26

Ho eseguito questo codice su un'istanza EC2.

def create1k(): 
    s = "" 
    for i in range(1024): 
     s += '*' 
    return s 

def create1m(): 
    s = "" 
    x = create1k() 
    for i in range(1024): 
     s += x 
    return s 

def create1g(): 
    s = "" 
    x = create1m() 
    for i in range(1024): 
     s += x 
    return s 

print("begin") 
s = "" 
x = create1g() 
for i in range(1024): 
    s += x 
    print(str(i) + "g ok") 
    print(str(len(s)) + ' bytes') 

e questo è l'uscita

[[email protected] ~]$ time python hog.py 
begin 
0g ok 
1073741824 bytes 
1g ok 
2147483648 bytes 
2g ok 
3221225472 bytes 
3g ok 
4294967296 bytes 
4g ok 
5368709120 bytes 
5g ok 
6442450944 bytes 
6g ok 
7516192768 bytes 
7g ok 
8589934592 bytes 
8g ok 
9663676416 bytes 
9g ok 
10737418240 bytes 
10g ok 
11811160064 bytes 
11g ok 
12884901888 bytes 
12g ok 
13958643712 bytes 
13g ok 
15032385536 bytes 
14g ok 
16106127360 bytes 
15g ok 
17179869184 bytes 
16g ok 
18253611008 bytes 
17g ok 
19327352832 bytes 
18g ok 
20401094656 bytes 
19g ok 
21474836480 bytes 
20g ok 
22548578304 bytes 
21g ok 
23622320128 bytes 
22g ok 
24696061952 bytes 
23g ok 
25769803776 bytes 
24g ok 
26843545600 bytes 
25g ok 
27917287424 bytes 
26g ok 
28991029248 bytes 
27g ok 
30064771072 bytes 
28g ok 
31138512896 bytes 
29g ok 
32212254720 bytes 
30g ok 
33285996544 bytes 
31g ok 
34359738368 bytes 
32g ok 
35433480192 bytes 
33g ok 
36507222016 bytes 
34g ok 
37580963840 bytes 
35g ok 
38654705664 bytes 
36g ok 
39728447488 bytes 
37g ok 
40802189312 bytes 
38g ok 
41875931136 bytes 
39g ok 
42949672960 bytes 
40g ok 
44023414784 bytes 
41g ok 
45097156608 bytes 
42g ok 
46170898432 bytes 
43g ok 
47244640256 bytes 
44g ok 
48318382080 bytes 
45g ok 
49392123904 bytes 
46g ok 
50465865728 bytes 
47g ok 
51539607552 bytes 
48g ok 
52613349376 bytes 
49g ok 
53687091200 bytes 
50g ok 
54760833024 bytes 
51g ok 
55834574848 bytes 
52g ok 
56908316672 bytes 
53g ok 
57982058496 bytes 
54g ok 
59055800320 bytes 
55g ok 
60129542144 bytes 
56g ok 
61203283968 bytes 
57g ok 
62277025792 bytes 
58g ok 
63350767616 bytes 
59g ok 
64424509440 bytes 
60g ok 
65498251264 bytes 
61g ok 
66571993088 bytes 
62g ok 
67645734912 bytes 
63g ok 
68719476736 bytes 
64g ok 
69793218560 bytes 
65g ok 
70866960384 bytes 
66g ok 
71940702208 bytes 
67g ok 
73014444032 bytes 
68g ok 
74088185856 bytes 
69g ok 
75161927680 bytes 
70g ok 
76235669504 bytes 
71g ok 
77309411328 bytes 
72g ok 
78383153152 bytes 
73g ok 
79456894976 bytes 
74g ok 
80530636800 bytes 
75g ok 
81604378624 bytes 
76g ok 
82678120448 bytes 
77g ok 
83751862272 bytes 
78g ok 
84825604096 bytes 
79g ok 
85899345920 bytes 
80g ok 
86973087744 bytes 
81g ok 
88046829568 bytes 
82g ok 
89120571392 bytes 
83g ok 
90194313216 bytes 
84g ok 
91268055040 bytes 
85g ok 
92341796864 bytes 
86g ok 
93415538688 bytes 
87g ok 
94489280512 bytes 
88g ok 
95563022336 bytes 
89g ok 
96636764160 bytes 
90g ok 
97710505984 bytes 
91g ok 
98784247808 bytes 
92g ok 
99857989632 bytes 
93g ok 
100931731456 bytes 
94g ok 
102005473280 bytes 
95g ok 
103079215104 bytes 
96g ok 
104152956928 bytes 
97g ok 
105226698752 bytes 
98g ok 
106300440576 bytes 
99g ok 
107374182400 bytes 
100g ok 
108447924224 bytes 
101g ok 
109521666048 bytes 
102g ok 
110595407872 bytes 
103g ok 
111669149696 bytes 
104g ok 
112742891520 bytes 
105g ok 
113816633344 bytes 
106g ok 
114890375168 bytes 
107g ok 
115964116992 bytes 
108g ok 
117037858816 bytes 
109g ok 
118111600640 bytes 
110g ok 
119185342464 bytes 
111g ok 
120259084288 bytes 
112g ok 
121332826112 bytes 
113g ok 
122406567936 bytes 
114g ok 
123480309760 bytes 
115g ok 
124554051584 bytes 
116g ok 
125627793408 bytes 
Traceback (most recent call last): 
    File "hog.py", line 25, in <module> 
    s += x 
MemoryError 

real 1m10.509s 
user 0m16.184s 
sys 0m54.320s 

errore memoria dopo 116GB.

[[email protected] ~]$ python --version 
Python 2.7.12 

[[email protected] ~]$ free -m 
      total  used  free  shared buffers  cached 
Mem:  122953  430  122522   0   11  113 
-/+ buffers/cache:  304  122648 
Swap:   0   0   0 

provata su EC2 esempio r3.4xlarge esecuzione a 64 bit Amazon Linux AMI 2016,09

Risposta breve sarebbe: se si dispone di più di 100 GB di RAM, una stringa Python può utilizzare fino più di tanto la memoria.

+5

Grazie per aver condiviso l'esperimento. Ora chiunque può replicare questo in futuro per le proprie ricerche. – Raiyan

Problemi correlati