2014-09-16 13 views
7

Tôi vẫn còn một câu hỏi khác về thu gom rác ở Julia. Dưới đây là ví dụ tối thiểu:Julia: bộ sưu tập rác bên trong các chức năng hoạt động khác với trong không gian toàn cầu

function OscarTheGrouch() 
    A = rand(Float32, 20000, 20000); 
    A = 0; 
    gc(); 
end 

Gọi RAM sử dụng để tăng 1,6 GB. Gọi gc() sau đó làm cho nó giảm 1,6 GB.

Ngược lại, chỉ cần thực hiện các mã bên trong hàm trong phạm vi toàn cầu, tức là thực hiện

A = rand(Float32, 20000, 20000); 
A = 0; 
gc(); 

lá RAM sử dụng không thay đổi trước và sau khi thực hiện.

My previous RAM use question hóa ra đơn giản là do kết quả trung gian được lưu trữ là ans. Tuy nhiên, gọi whos() sau khi gọi OscarTheGrouch() sẽ không hiển thị kết quả mảng trung gian nào được lưu trữ.

  • Vì vậy, bộ nhớ được giữ ở đâu? Việc thu gom rác bên trong các chức năng có hoạt động khác (ít tích cực hơn) so với phạm vi toàn cầu?

Tôi đã bỏ qua article on Julia functions, nhưng không thấy bất kỳ điều gì hiển nhiên.

+0

Nhiều việc là khác nhau trong phạm vi toàn cầu, chắc chắn - trình biên dịch có thể để suy ra ít hơn. Tôi không nghĩ là một trong số họ. – IainDunning

+0

Được đăng dưới dạng sự cố tại https://github.com/JuliaLang/julia/issues/8393 –

Trả lời

6

tôi có thể mô phỏng hành vi của bạn

   _ 
    _  _ _(_)_  | A fresh approach to technical computing 
    (_)  | (_) (_) | Documentation: http://docs.julialang.org 
    _ _ _| |_ __ _ | Type "help()" for help. 
    | | | | | | |/ _` | | 
    | | |_| | | | (_| | | Version 0.3.0 (2014-08-20 20:43 UTC) 
_/ |\__'_|_|_|\__'_| | Official http://julialang.org/ release 
|__/     | x86_64-apple-darwin13.3.0 

julia> # Memory now about 64M 

julia> A = rand(Float32, 20000, 20000); 

julia> # Memory now about 1600M 

julia> A = 0 
0 
julia> gc() 

julia> # Memory now about 75M 

julia> function test1() 
     A = rand(Float32, 20000, 20000) 
     nothing 
     end 
test1 (generic function with 1 method) 

julia> test1() # Still about 78, although briefly higher 

julia> function test2() 
     A = rand(Float32, 20000, 20000) 
     A = 0 
     end 
test2 (generic function with 1 method) 

julia> test2() # Same behaviour 
0 

julia> function test3() 
      A = rand(Float32, 20000, 20000) 
      A = 0 
      gc() 
     end 
test3 (generic function with 1 method) 

julia> test3() # Now at 1600M 
+0

Tôi nghĩ đó cũng là điều mà @DumpsterDoofus cũng thấy. Vấn đề là một cuộc gọi 'gc()' được biên dịch thành một hàm dường như không thu thập các mảng không thể truy cập được phân bổ trong cùng hàm đó - mà tôi có thể tái sản xuất. Ngay cả người lạ, có vẻ như cuộc gọi 'gc()' trong 'OscarTheGrouch()' là * ngăn chặn * bộ sưu tập! –

+0

Vâng, như Matt B. nói, tôi nghĩ rằng có một chút hiểu lầm: tôi nhận được kết quả tương tự như bạn làm khi tôi thực hiện những gì bạn đã làm (ví dụ, thực thi mã trong phạm vi toàn cầu), và đó là hoàn hảo bình thường. Tuy nhiên, hãy thử thực hiện 'OscarTheGrouch' thay thế, và xem điều gì xảy ra! Quan điểm của tôi là khi mã được bọc bên trong một hàm và chức năng được thực hiện, việc thu thập rác không hoạt động đúng cách. – DumpsterDoofus

+2

Tôi hiểu rồi, bây giờ tôi đã tái tạo nó, điều đó thật tinh tế. Điều này là thích hợp cho một vấn đề Github về Julia, không phải là một câu hỏi SO. Tôi không chắc ai đã downvoted tôi, nhưng, không phải là mát mẻ. – IainDunning

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