2009-09-23 25 views
57

Định kỳ tôi lập trình sloppily. Ok, tôi thường xuyên lập trình, nhưng đôi khi bắt kịp với tôi dưới dạng lỗi bộ nhớ. Tôi bắt đầu thực hiện một kỷ luật nhỏ trong việc xóa các đối tượng bằng lệnh rm() và mọi thứ trở nên tốt hơn. Tôi thấy các thông điệp hỗn hợp trực tuyến về việc liệu tôi có nên gọi gc() một cách rõ ràng sau khi xóa các đối tượng dữ liệu lớn hay không. Một số người nói rằng trước khi R trả về một lỗi bộ nhớ nó sẽ chạy gc() trong khi những người khác nói rằng gc buộc bằng tay là một ý tưởng tốt.Buộc thu gom rác để chạy trong R với lệnh gc()

Tôi có nên chạy gc() sau khi xóa các đối tượng lớn để đảm bảo tính khả dụng bộ nhớ tối đa không?

Trả lời

38

"Có thể." Tôi cũng làm như vậy, và thường thậm chí trong một vòng lặp như trong

cleanMem <- function(n=10) { for (i in 1:n) gc() } 

Tuy nhiên, theo kinh nghiệm của tôi, khôi phục bộ nhớ về trạng thái nguyên sơ.

Vì vậy, những gì tôi thường làm là giữ các tác vụ trong tay trong tệp tập lệnh và thực hiện những tác vụ đó bằng lối vào 'r' (trên Unix và từ gói 'littler'). Rscript là một thay thế trên hệ điều hành khác.

công việc đó xảy ra đồng ý với

mà chúng tôi đề cập ở đây trước đó.

+37

Tại sao nó lại chạy 'gc()' nhiều lần? – samhiggins2001

+0

@ DirkEddelbuettel - Tại sao chạy 'gc()' nhiều lần? –

6

"Có thể". Tôi không thực sự có một câu trả lời dứt khoát. Nhưng tệp trợ giúp cho thấy rằng thực sự chỉ có hai lý do để gọi gc():

  1. Bạn muốn báo cáo sử dụng bộ nhớ.
  2. Sau khi xóa một đối tượng lớn, "nó có thể nhắc R trả bộ nhớ cho hệ điều hành."

Vì nó có thể làm chậm mô phỏng lớn với các cuộc gọi lặp lại, tôi có xu hướng chỉ làm điều đó sau khi xóa nội dung nào đó lớn. Nói cách khác, tôi không nghĩ rằng nó có ý nghĩa để có hệ thống gọi nó tất cả các thời gian, trừ khi bạn có lý do chính đáng để.

7

Không. Nếu không có đủ bộ nhớ cho hoạt động, R sẽ tự động chạy gc().

+1

Không phải lúc nào cũng xảy ra tự động theo kinh nghiệm của tôi. Nếu bạn làm việc thường xuyên với dữ liệu lớn, hãy gc() thường xuyên hoặc khởi động lại phiên R của bạn. – Zach

+0

Vui lòng cung cấp bằng chứng cho tuyên bố của bạn. – hadley

+0

Windows 7 với R 2.12.1 – Zach

17

Từ trang giúp đỡ về gc:

Một tiếng gọi của 'gc' gây ra thu gom rác thải diễn ra. Điều này sẽ cũng diễn ra tự động mà không cần can thiệp của người dùng và mục đích chính gọi là 'gc' là dành cho báo cáo về mức sử dụng bộ nhớ. Tuy nhiên, có thể hữu ích khi gọi 'gc' sau khi một đối tượng lớn đã bị xóa, vì điều này có thể nhắc R trả lại bộ nhớ cho hệ điều hành.

Vì vậy, có thể hữu ích để làm, nhưng phần lớn bạn không cần phải làm.Ý kiến ​​cá nhân của tôi là nó là mã của phương sách cuối cùng - bạn không nên xả rác mã của bạn với các câu lệnh là tất nhiên, nhưng nếu máy của bạn tiếp tục rơi xuống, và bạn đã thử mọi thứ khác, thì nó có thể hữu ích .

Bằng mọi thứ khác, tôi muốn nói những thứ như

  1. chức năng Viết chứ không phải là kịch bản thô, vì vậy biến đi ra khỏi phạm vi.

  2. Làm trống không gian làm việc của bạn nếu bạn gặp vấn đề này với một vấn đề khác.

  3. Việc huỷ dữ liệu/biến mà bạn không quan tâm đến (tôi thường xuyên nhận được các bảng tính với hàng chục cột nhàm chán.)

+3

Trong máy tính của tôi gc() phát hành một số bộ nhớ nhưng nó không hoàn hảo. Nếu tôi tải một đối tượng lớn làm một cái gì đó với nó, xóa nó và sử dụng gc() và tôi không nhận được cùng một bộ nhớ miễn phí mà lúc đầu. Tôi càng làm nhiều bộ nhớ hơn thì tôi không thể phục hồi. Cuối cùng, sau nhiều hoạt động với objetcs lớn tôi có thể hết bộ nhớ. Tôi đang ở trong Windows 10 x64 và tôi sử dụng RAM 16 GB. – skan

12

Một chút muộn để đảng, nhưng:.

Rõ ràng gọi gc sẽ giải phóng bộ nhớ "hiện tại". ... vì vậy nếu các quá trình khác cần bộ nhớ, đó có thể là một ý tưởng hay. Ví dụ: trước khi gọi system hoặc tương tự. Hoặc có lẽ khi bạn "hoàn thành" với tập lệnh và R sẽ không hoạt động trong một thời gian cho đến khi công việc tiếp theo đến - một lần nữa, để các quy trình khác nhận được nhiều bộ nhớ hơn.

Nếu bạn chỉ muốn tập lệnh của mình chạy nhanh hơn, nó sẽ không quan trọng vì R sẽ gọi nó sau này nếu cần. Nó thậm chí có thể chậm hơn vì chu kỳ GC bình thường có thể không bao giờ cần thiết để gọi nó.

... nhưng nếu bạn muốn đo thời gian, bạn nên thực hiện GC trước khi chạy thử nghiệm của mình. Đây là những gì system.time thực hiện theo mặc định.

CẬP NHẬT Như @DWin chỉ ra, R (hoặc C# hoặc Java vv) không phải lúc nào cũng biết khi nào bộ nhớ thấp và GC cần chạy. Vì vậy, đôi khi bạn có thể cần phải làm GC như một công việc xung quanh cho sự thiếu sót trong hệ thống bộ nhớ.

11

Giả sử R chỉ sử dụng RAM. Điều đó không đúng trên máy Mac (và tôi nghi ngờ nó cũng không đúng trên Windows.) Nếu nó hết RAM, nó sẽ bắt đầu sử dụng bộ nhớ ảo. Đôi khi, nhưng không phải lúc nào, các quy trình sẽ 'nhận ra' rằng chúng cần chạy gc() và giải phóng bộ nhớ. Khi họ không làm như vậy, bạn có thể thấy điều này bằng cách sử dụng ActivityMonitor.app và thấy rằng tất cả RAM bị chiếm đóng và truy cập đĩa đã tăng lên. Tôi thấy rằng khi tôi đang chạy hồi quy Cox lớn, tôi có thể tránh tràn vào bộ nhớ ảo (với truy cập đĩa chậm) bằng các cuộc gọi trước đó với gc(); cph(...)

+0

Tôi có thể xác nhận R không sử dụng pagefile trên Windows và đôi khi nó sẽ rất hữu ích. – skan

Các vấn đề liên quan