2015-05-15 17 views
20

Uruchamiam Python 2.7 na maszynie Linux z 16 GB pamięci RAM i 64-bitowym systemem operacyjnym. Skrypt Pythona, który napisałem, może załadować zbyt wiele danych do pamięci, co spowalnia maszynę aż do momentu, w którym nie mogę nawet zabić procesu.Ogranicz użycie pamięci?

Chociaż mogę ograniczyć pamięć wywołując:

ulimit -v 12000000 

w mojej skorupie przed uruchomieniem skryptu, chciałbym dołączyć ograniczający opcję w samym skrypcie. Wszędzie, gdzie wyglądałem, moduł resource jest cytowany jako mający tę samą moc, co ulimit. Ale wołanie:

import resource 
_, hard = resource.getrlimit(resource.RLIMIT_DATA) 
resource.setrlimit(resource.RLIMIT_DATA, (12000, hard)) 

na początku mojego skryptu nie robi absolutnie nic. Nawet ustawienie wartości zaledwie 12000 nigdy nie spowodowało awarii. Próbowałem tego samego z RLIMIT_STACK, a także z tym samym wynikiem. Co ciekawe, dzwonienie pod numer:

import subprocess 
subprocess.call('ulimit -v 12000', shell=True) 

nic nie robi.

Co robię źle? Nie mogłem znaleźć żadnych rzeczywistych przykładów użycia online.

+0

Czy jest miejsce na zwiększenie wydajności pamięci? – TigerhawkT3

+1

Jest, ale to zajmie trochę czasu. W tej chwili muszę go przetestować i upewnić się, że nie wyłącza komputera. A posiadanie pamięci bezpiecznej dla pamięci przyda się również później. – Arne

+1

Od kiedy jest w Pythonie 2.7, co powiesz na przejście na Python 3 i użycie konwertera 2 na 3 w twoim programie? Python 3 ma kilka ulepszeń wydajności w stosunku do Python 2, z których niektóre są związane z pamięcią. – TigerhawkT3

Odpowiedz

12

resource.RLIMIT_VMEM jest zasobem corresponding to ulimit -v.

RLIMIT_DATA podczas gdy newer memory managers tend to use mmap instead.

Po drugie, ulimit/setrlimit wpływa tylko na bieżący proces i jego przyszłe potomstwo.

odniesieniu do komunikatu AttributeError: 'module' object has no attribute 'RLIMIT_VMEM': the resource module docs wspomnieć to możliwość:

This module does not attempt to mask platform differences — symbols not defined for a platform will not be available from this module on that platform.

Według bashulimit source połączonego powyżej, jeśli stosuje RLIMIT_ASRLIMIT_VMEM nie jest zdefiniowana.

+1

Nie używam wielowątkowości, więc mam nadzieję, że to nie problem. Ale gdy wchodzę 'RLIMIT_DATA', pojawia się następujący komunikat o błędzie: ' Traceback (most recent call last): File "my_script.py", linia 417, w sys.exit (main()) pliku "mój_script.py ", wiersz 391, główny _, hard = resource.getrlimit (resource.RLIMIT_VMEM) AttributeError: obiekt 'module' nie ma atrybutu 'RLIMIT_VMEM'' Z listy, do której się odnosiłeś, wszystkie pola zostały znalezione - z wyjątkiem ten .. Próbuję uruchomić go z Python 3.x teraz .. – Arne

+0

Dziękuję za wyjaśnienia! – Arne