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ó?
Hãy xem 'whos() 'giữa mỗi lệnh. 'ans' mất một số phòng. – rickhg12hs
@ 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
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