Vraag Numpy Memory Error op Linux Server maar niet Mac


Ik weet dat er een hoop numpy memory error-onderwerpen zijn, dus ik hoop dat ik niets heb gedupliceerd. Ik probeer een np-array te maken met np.zeros((500000,10000)). Dit werkt prima op mijn Mac met 16G geheugen, maar op een Linux-server met 28G RAM mislukt het meteen met Memory Error. Ik heb geverifieerd dat ik de 64-bits versie van Ubuntu en Python gebruik, en ik gebruik Numpy 1.9.3. Het enige verschil dat ik zag tussen systemen (afgezien van het voor de hand liggende) is dat tijdens het hardlopen ulimit -a Ik krijg:

Linux: max locked memory (kbytes, -l) 64

Mac: max locked memory (kbytes, -l) unlimited

Zou dit de reden kunnen zijn dat ik dit commando niet kan uitvoeren? Zo niet, is er dan een andere configuratieoptie die ik mis?


12
2017-09-22 17:51


oorsprong


antwoorden:


Mijn beste gok is:

  1. De Mac heeft een swap die meer toegewezen geheugen toestaat dan het RAM-geheugen dat je ziet.
  2. De Mac realiseert zich niet dat de array niet in het geheugen past totdat het geheugen daadwerkelijk wordt gebruikt. Dus de array past eigenlijk niet in het geheugen, maar je weet het pas als je dat geheugen gebruikt.

Ik baseer mijn eerste gok op het feit dat in 64 bit je array 500000 * 10000 * 8 = 40 GB RAM 20 GB in 32 bit zal innemen, en daarom past de array niet in het geheugen dat je hebt. Er kan een swap zijn om rekening te houden met het ontbrekende geheugen.

Ik baseer mijn tweede gok deze link, waar wordt uitgelegd dat np.zeros de nullen in het geheugen niet toewijst totdat het geheugen voor de eerste keer wordt geopend. Ik heb in mijn linux (Ubuntu) computer getest dat np.zeros met toenemende arrays werkt totdat ik mijn RAM-limiet heb bereikt. Dan krijg ik een geheugenfout, zelfs als het geheugen niet echt wordt toegewezen.

Nadat u de matrix hebt gemaakt (vergroot de grootte om het geheugengebruik te wissen):

a = np.zeros((50,10))

U kunt het werkelijk benodigde geheugen controleren door een nul op te slaan in elke cel van de matrix:

a[:,:] = 0.0

Of een bewerking afdwingen zodat het geheugen wordt geopend en daarom wordt toegewezen:

a = a + a

Houd bij het uitvoeren van deze controle het geheugengebruik van de computer bij om te weten wanneer het geheugen is toegewezen.


3
2018-04-24 20:29