2014-09-08 11 views
12

Tôi hơi bối rối bởi việc cấp phát bộ nhớ trong Julia. Tôi know from the FAQ rằng việc xóa bộ nhớ được sử dụng bởi một biến lớn được thực hiện bằng cách đặt nó thành một cái gì đó nhỏ (như 0) và sau đó chạy gc().Bối rối do phân bổ bộ nhớ và thu gom rác thải trong Julia

Tuy nhiên, tôi hơi bối rối bởi những điều sau đây. Tôi tạo ra một ngẫu nhiên Float32 mảng:

@time A = rand(Float32, 10000, 10000); 

time chỉ ra rằng ~ 400MB RAM đã được phân bổ, và Julia sử dụng RAM 400MB tăng. Điều này thật ý nghĩa.

sau đó tôi áp dụng fft, nhưng không ràng buộc kết quả cho bất kỳ biến:

@time fft(A); 

time chỉ ra rằng ~ 800MB RAM đã được phân bổ, và Julia sử dụng RAM 800MB tăng.

Tuy nhiên, mức sử dụng RAM vẫn cao hơn 1,2 GB lúc bắt đầu. Và điều đó làm tôi bối rối, bởi vì tôi không cân bằng bất kỳ biến nào với fft(A), vì vậy tôi hy vọng rằng 800MB được phân bổ sẽ được giải phóng ngay sau khi fft được thực thi.

Tôi cố gắng chạy gc, nghĩ rằng Julia sẽ nhận ra rằng có một 800MB thêm RAM mà đã được sử dụng cho không có gì:

gc(); 

này không có gì. Mức sử dụng RAM vẫn ở mức ~ 1.3GB.

Tuy nhiên, hai dòng sau,

A = 0; 
gc(); 

giải phóng tất cả 1.2 GB mà đang được sử dụng, mặc dù thực tế rằng sizeof(A) chỉ 400MB. Vì vậy, câu hỏi của tôi là:

  • Tại sao nó lại xuất hiện như thể một đối tượng mà là 400MB trong kích thước (theo sizeof) thực sự đã 1.2 GB phân bổ cho nó?
+3

Hãy xem 'whos() 'giữa mỗi lệnh. 'ans' mất một số phòng. – rickhg12hs

+2

@ rickhg12hs: Ồ, vì vậy dữ liệu được phân bổ cho 'ans', * ngay cả khi lệnh được chấm dứt bằng dấu chấm phẩy *? Wow, ok, có ý nghĩa, mặc dù nó có vẻ phản trực giác với người mới bắt đầu như tôi. Tâm trí đưa nó lên như một câu trả lời để tôi có thể chấp nhận? – DumpsterDoofus

+1

Semicolon chỉ là để ngăn chặn đầu ra, như trong MATLAB (mà lấy cảm hứng từ nó). Tôi không nghĩ rằng trường hợp này bạn đã gặp phải ở đây xuất hiện nhiều bởi vì người ta thường phân bổ kết quả cho một thứ gì đó, nhưng điều đó thật thú vị. – IainDunning

Trả lời

10

Mỗi lệnh trả về một cái gì đó, ngay cả khi chỉ là nothing. ans được gán cho mỗi đối tượng được trả về ngay cả khi không có gán trực tiếp và ngay cả khi lệnh kết thúc bằng dấu chấm phẩy.

Sử dụng whos() giữa các lệnh để xem bài tập và không gian được phân bổ.

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