การจัดการหน่วยความจำ R / ไม่สามารถจัดสรรเวกเตอร์ที่มีขนาด n Mb


149

ฉันพบปัญหาในการพยายามใช้วัตถุขนาดใหญ่ใน R ตัวอย่างเช่น:

> memory.limit(4000)
> a = matrix(NA, 1500000, 60)
> a = matrix(NA, 2500000, 60)
> a = matrix(NA, 3500000, 60)
Error: cannot allocate vector of size 801.1 Mb
> a = matrix(NA, 2500000, 60)
Error: cannot allocate vector of size 572.2 Mb # Can't go smaller anymore
> rm(list=ls(all=TRUE))
> a = matrix(NA, 3500000, 60) # Now it works
> b = matrix(NA, 3500000, 60)
Error: cannot allocate vector of size 801.1 Mb # But that is all there is room for

ฉันเข้าใจว่าสิ่งนี้เกี่ยวข้องกับความยากลำบากในการได้รับบล็อกหน่วยความจำต่อเนื่อง (จากที่นี่ ):

ข้อความแสดงข้อผิดพลาดที่เริ่มต้นไม่สามารถจัดสรรเวกเตอร์ที่มีขนาดระบุความล้มเหลวในการรับหน่วยความจำเนื่องจากขนาดเกินขีด จำกัด พื้นที่ที่อยู่สำหรับกระบวนการหรือมีแนวโน้มมากขึ้นเนื่องจากระบบไม่สามารถให้หน่วยความจำได้ โปรดทราบว่าในรุ่น 32 บิตอาจมีหน่วยความจำว่างเพียงพอ แต่ไม่มีบล็อกที่อยู่ติดต่อกันขนาดใหญ่พอที่จะแมป

ฉันจะแก้ไขสิ่งนี้ได้อย่างไร ปัญหาหลักของฉันคือฉันไปถึงจุดหนึ่งในสคริปต์ของฉันและ R ไม่สามารถจัดสรร 200-300 Mb สำหรับวัตถุ ... ฉันไม่สามารถจัดสรรบล็อกได้ล่วงหน้าเพราะฉันต้องการหน่วยความจำสำหรับการประมวลผลอื่น ๆ สิ่งนี้เกิดขึ้นแม้เมื่อฉันเอาวัตถุที่ไม่จำเป็นออกไปอย่างไม่ตั้งใจ

แก้ไข: ใช่ขอโทษ: Windows XP SP3, 4Gb RAM, R 2.12.0:

> sessionInfo()
R version 2.12.0 (2010-10-15)
Platform: i386-pc-mingw32/i386 (32-bit)

locale:
[1] LC_COLLATE=English_Caribbean.1252  LC_CTYPE=English_Caribbean.1252   
[3] LC_MONETARY=English_Caribbean.1252 LC_NUMERIC=C                      
[5] LC_TIME=English_Caribbean.1252    

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base

ลองใช้ 'ฟรี' เพื่อยกเลิกการจัดสรรหน่วยความจำของกระบวนการอื่นที่ไม่ได้ใช้
Manoel Galdino

5
@ Manoel Galdino: 'ฟรี' คืออะไร? ฟังก์ชั่น R หรือไม่?
Benjamin

3
@Manoel: ใน R งานการเพิ่มหน่วยความจำจะถูกจัดการโดยตัวรวบรวมขยะไม่ใช่ผู้ใช้ หากการทำงานในระดับ C หนึ่งสามารถด้วยตนเองCallocและFreeหน่วยความจำ แต่ฉันสงสัยว่านี่ไม่ใช่สิ่งที่เบนจามินจะทำ
Sharpie

ในไลบรารี XML คุณสามารถใช้งานได้ฟรี จากเอกสารประกอบ: "ฟังก์ชั่นทั่วไปนี้มีไว้สำหรับปล่อยหน่วยความจำที่เกี่ยวข้องกับวัตถุที่กำหนดอย่างชัดเจนมันมีไว้สำหรับใช้กับวัตถุตัวชี้ภายนอกซึ่งไม่มีฟังก์ชั่น / ขั้นตอนสุดท้ายอัตโนมัติที่ล้างหน่วยความจำที่ใช้ วัตถุพื้นเมือง "
Manoel Galdino

คำตอบ:


78

พิจารณาว่าคุณต้องการข้อมูลทั้งหมดนี้อย่างชัดเจนหรือไม่หรือเมทริกซ์จะกระจัดกระจาย? มีการสนับสนุนที่ดีใน R (ดูMatrixแพ็คเกจสำหรับเช่น) สำหรับเมทริกซ์กระจัดกระจาย

ทำให้กระบวนการและวัตถุอื่น ๆ ทั้งหมดใน R ให้น้อยที่สุดเมื่อคุณต้องการสร้างวัตถุที่มีขนาดนี้ ใช้gc()เพื่อล้างหน่วยความจำที่ไม่ได้ใช้ในขณะนี้หรือสร้างวัตถุที่คุณต้องการในเซสชันเดียวเท่านั้น

หากสิ่งที่กล่าวมาข้างต้นไม่สามารถช่วยเหลือได้ให้ใช้เครื่อง 64- บิตที่มี RAM มากเท่าที่คุณสามารถซื้อได้และติดตั้ง R 64- บิต

หากคุณไม่สามารถทำได้มีบริการออนไลน์มากมายสำหรับการใช้คอมพิวเตอร์ระยะไกล

หากคุณไม่สามารถทำเช่นนั้นเครื่องมือการแมปหน่วยความจำเช่นแพ็คเกจff(หรือbigmemoryตามที่ Sascha กล่าวถึง) จะช่วยคุณสร้างโซลูชันใหม่ จากประสบการณ์ที่ จำกัด ของฉันffคือแพ็คเกจขั้นสูง แต่คุณควรอ่านHigh Performance Computingหัวข้อในมุมมองภารกิจ CRAN


1
งานคือการจัดหมวดหมู่ภาพด้วย randomForest ฉันต้องการเมทริกซ์ของข้อมูลการฝึกอบรม (มากถึง 60 แบนด์) และที่ใดก็ได้จาก 20,000 ถึง 6,000,000 แถวเพื่อป้อนไปยังป่าสุ่ม ขณะนี้ฉันออกสูงสุดที่ประมาณ 150,000 แถวเพราะฉันต้องการบล็อกที่ต่อเนื่องกันเพื่อเก็บออบเจกต์สุ่มป่าผล ... ซึ่งเป็นสาเหตุที่หน่วยความจำขนาดใหญ่ไม่ช่วยด้วยเนื่องจาก randomForest ต้องการวัตถุเมทริกซ์
Benjamin

คุณหมายถึงอะไรโดย "สร้างเฉพาะวัตถุที่คุณต้องการในหนึ่งเซสชัน"
Benjamin

สร้าง 'a' เพียงครั้งเดียวถ้าคุณเข้าใจผิดครั้งแรกที่เริ่มเซสชันใหม่
mdsumner

1
ฉันจะเพิ่มว่าสำหรับโปรแกรมที่มีลูปขนาดใหญ่ที่ทำการคำนวณจำนวนมาก แต่เอาต์พุตมีขนาดค่อนข้างเล็กอาจเป็นหน่วยความจำที่มีประสิทธิภาพมากกว่าในการเรียกส่วนภายในของลูปผ่าน Rscript (จาก BASH หรือ Python Script) และรวบรวม / รวมผลลัพธ์หลังจากนั้นในสคริปต์อื่น ด้วยวิธีนี้หน่วยความจำจะได้รับการปลดปล่อยอย่างสมบูรณ์หลังจากการทำซ้ำแต่ละครั้ง มีการคำนวณที่เสียไปเล็กน้อยจากการโหลดซ้ำ / คำนวณตัวแปรที่ส่งไปยังลูป แต่อย่างน้อยคุณก็สามารถแก้ไขปัญหาหน่วยความจำได้
Benjamin

54

สำหรับผู้ใช้ Windows สิ่งต่อไปนี้ช่วยให้ฉันเข้าใจข้อ จำกัด ของหน่วยความจำได้มาก:

  • ก่อนที่จะเปิด R ให้เปิดการตรวจสอบทรัพยากรของ Windows (Ctrl-Alt-Delete / Start แท็บตัวจัดการงาน / ประสิทธิภาพ / คลิกที่ปุ่มด้านล่าง 'การตรวจสอบทรัพยากร' / แท็บหน่วยความจำ)
  • คุณจะเห็นจำนวนหน่วยความจำ RAM ที่เราใช้ไปแล้วก่อนที่คุณจะเปิด R และแอปพลิเคชันใด ในกรณีของฉันใช้ 1.6 GB จาก 4GB ทั้งหมด ดังนั้นฉันจะได้รับ 2.4 GB สำหรับ R เท่านั้น แต่ตอนนี้แย่ลง ...
  • เปิด R และสร้างชุดข้อมูล 1.5 GB จากนั้นลดขนาดลงเหลือ 0.5 GB Resource Monitor แสดงว่า RAM ของฉันถูกใช้งานเกือบ 95%
  • use gc()to do garbage collection => ใช้งานได้ฉันสามารถเห็นการใช้หน่วยความจำลดลงเหลือ 2 GB

ป้อนคำอธิบายรูปภาพที่นี่

คำแนะนำเพิ่มเติมที่ใช้กับเครื่องของฉัน:

  • เตรียมคุณสมบัติบันทึกเป็นไฟล์ RData ปิด R เปิดใหม่ R และโหลดคุณสมบัติรถไฟ ผู้จัดการฝ่ายทรัพยากรมักจะแสดงให้เห็นถึงการใช้งานหน่วยความจำลดลงซึ่งหมายความว่าแม้ GC () ไม่กู้คืนหน่วยความจำที่เป็นไปได้ทั้งหมดและปิด / เปิดใหม่ R ทำงานที่ดีที่สุดที่จะเริ่มต้นกับหน่วยความจำสูงสุดที่มีอยู่
  • เคล็ดลับอีกอย่างคือโหลดเฉพาะชุดรถไฟสำหรับการฝึกอบรม (ไม่โหลดชุดทดสอบซึ่งโดยทั่วไปจะมีขนาดครึ่งหนึ่งของชุดรถไฟ) ขั้นตอนการฝึกอบรมสามารถใช้หน่วยความจำสูงสุด (100%) ดังนั้นสิ่งที่มีอยู่จึงมีประโยชน์ ทั้งหมดนี้ใช้กับเม็ดเกลือในขณะที่ฉันกำลังทดลองกับขีด จำกัด หน่วยความจำ R

9
R ทำการเก็บขยะด้วยตัวเองgc()เป็นเพียงภาพลวงตา การตรวจสอบตัวจัดการงานเป็นเพียงการดำเนินงานขั้นพื้นฐานของ windows คำแนะนำเดียวที่ฉันเห็นด้วยกับคือการบันทึกในรูปแบบ. ข้อมูล
David Arenburg

3
@DavidArenburg gc () เป็นภาพลวงตา? นั่นหมายถึงภาพที่ฉันได้แสดงให้เห็นว่าการใช้หน่วยความจำลดลงเป็นภาพลวงตา ฉันคิดว่าคุณผิด แต่ฉันอาจเข้าใจผิด
Timothée HENRY

4
ฉันไม่ได้หมายความว่าgc()ไม่ทำงาน ฉันแค่หมายความว่า R ทำโดยอัตโนมัติดังนั้นคุณไม่จำเป็นต้องทำด้วยตนเอง ดูที่นี่
David Arenburg

2
@DavidArenburg ฉันสามารถบอกคุณได้ว่าการใช้หน่วยความจำลดลงในภาพด้านบนเกิดจากคำสั่ง gc () ฉันไม่เชื่อว่าเอกสารที่คุณระบุนั้นถูกต้องอย่างน้อยก็ไม่ใช่สำหรับการตั้งค่าของฉัน (Windows, R เวอร์ชัน 3.1.0 (2014-04-10) แพลตฟอร์ม: i386-w64-mingw32 / i386 (32 บิต)
Timothée HENRY

15
ตกลงเป็นครั้งสุดท้าย gc() ไม่ทำงาน คุณไม่จำเป็นต้องใช้เพราะ R ทำมันขึ้นมา
David Arenburg

16

นี่คืองานนำเสนอในหัวข้อนี้ที่คุณอาจสนใจ:

http://www.bytemining.com/2010/08/taking-r-to-the-limit-part-ii-large-datasets-in-r/

ฉันยังไม่ได้ลองสิ่งที่พูดถึง แต่bigmemoryดูเหมือนว่าแพคเกจจะมีประโยชน์มาก


4
ทำงานได้ยกเว้นเมื่อคาดว่าจะมีคลาสเมทริกซ์ (และไม่ใช่ big.matrix)
Benjamin

14

วิธีที่ง่ายที่สุดในการก้าวเท้าเลี่ยงข้อ จำกัด นี้คือเปลี่ยนเป็น 64 บิต R


25
นั่นไม่ใช่การรักษาโดยทั่วไป - ฉันเปลี่ยนไปแล้วและตอนนี้ฉันมีError: cannot allocate vector of size ... Gbแทน (แต่ใช่ฉันมีข้อมูลจำนวนมาก)
om-nom-nom

2
อาจไม่ใช่วิธีรักษา แต่ก็ช่วยได้มาก เพียงแค่โหลดบน RAM และทำการเพิ่มหน่วยความจำให้มากขึ้น () หรืออาจคิดเกี่ยวกับการแบ่ง / สุ่มตัวอย่างข้อมูลของคุณ
random_forest_fanatic

หากคุณมีปัญหาแม้กระทั่งใน 64- บิตซึ่งไม่ จำกัด โดยพื้นฐานแล้วมันอาจมากกว่าที่คุณพยายามจัดสรรบางสิ่งที่มีขนาดใหญ่มาก คุณได้คำนวณว่าเวกเตอร์ควรมีขนาดใหญ่ทางทฤษฎีหรือไม่? มิฉะนั้นอาจเป็นเพราะคอมพิวเตอร์ของคุณต้องการ RAM มากกว่า แต่มีเพียงคุณเท่านั้นที่มีได้
hangmanwa7id

ยินดีที่ได้ลองใช้วิธีแก้ปัญหาแบบนี้ก่อนหน้านี้ ขอบคุณ
Nova

ยิ่งกว่านั้นนี่ไม่ใช่ปัญหาของ Windows เท่านั้น ฉันทำงานบน Ubuntu ในปัจจุบัน 64- บิต R โดยใช้เมทริกซ์และมีปัญหาในการจัดการวัตถุเมทริกซ์ 20048 x 96448

12

ฉันพบปัญหาที่คล้ายกันและฉันใช้แฟลชไดรฟ์ 2 รูปแบบเป็น 'ReadyBoost' ไดรฟ์ทั้งสองให้การเพิ่มหน่วยความจำ 8GB เพิ่มเติม (สำหรับแคช) และแก้ไขปัญหาและเพิ่มความเร็วของระบบโดยรวม หากต้องการใช้ Readyboost ให้คลิกขวาที่ไดรฟ์ไปที่คุณสมบัติและเลือกปุ่มตัวเลือก 'ReadyBoost' และเลือก 'ใช้อุปกรณ์นี้' แล้วคลิก Apply หรือตกลงเพื่อกำหนดค่า


11

ฉันตามไปที่หน้าช่วยเหลือของ mem.limit และพบว่าในคอมพิวเตอร์ R โดยค่าเริ่มต้นสามารถใช้ RAM ได้สูงสุด ~ 1.5 GB และผู้ใช้สามารถเพิ่มขีด จำกัด นี้ได้ ใช้รหัสต่อไปนี้

>memory.limit()
[1] 1535.875
> memory.limit(size=1800)

ช่วยฉันแก้ปัญหาของฉัน


1
ทำไมสิ่งนี้ถึงถูกลงคะแนน? แน่นอนว่ามันเป็นวิธีที่อันตราย แต่บ่อยครั้งก็สามารถช่วยได้หากจำเป็นต้องจัดสรรหน่วยความจำอีกเล็กน้อยเพื่อให้เซสชันใช้งานได้
Jeppe Olsen

3
นี่เป็นเพียงวิธีแก้ปัญหาเฉพาะของ windows
Jinhua Wang

9

หากคุณใช้งานสคริปต์ที่สภาพแวดล้อม linux คุณสามารถใช้คำสั่งนี้:

bsub -q server_name -R "rusage[mem=requested_memory]" "Rscript script_name.R"

และเซิร์ฟเวอร์จะจัดสรรหน่วยความจำที่ร้องขอให้คุณ (ตามข้อ จำกัด ของเซิร์ฟเวอร์ แต่ด้วยเซิร์ฟเวอร์ที่ดี - สามารถใช้ไฟล์ขนาดใหญ่ได้)


1
ฉันสามารถใช้สิ่งนี้กับอินสแตนซ์ Amazon EC2 ได้หรือไม่ ถ้าเป็นเช่นนั้นสิ่งที่ฉันวางในตำแหน่งของserver_name? ฉันกำลังcannot allocate vector size...พยายามทำสิ่งนี้ด้วยการพยายามทำเมทริกซ์เอกสารระยะยาวใน AMI และฉันไม่สามารถเข้าใจได้ว่าทำไมมันถึงมีหน่วยความจำไม่เพียงพอหรือต้องเช่าอีกมาก ขอบคุณ!
seth127

ฉันเป็นผู้เริ่มต้น Ubuntu และใช้ Rstudio กับมัน ฉันมี RAM 16 GB ฉันจะใช้กระบวนการที่คุณแสดงในคำตอบได้อย่างไร ขอบคุณ
runjumpfly

3

วิธีการบันทึก / โหลดที่กล่าวถึงข้างต้นใช้งานได้สำหรับฉัน ฉันไม่แน่ใจว่า / ถ้าgc()defrags หน่วยความจำ แต่ดูเหมือนว่าจะทำงาน

# defrag memory 
save.image(file="temp.RData")
rm(list=ls())
load(file="temp.RData")
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.