2014-10-03 2 views
3

Если я открываю FSI и вставьте следующее:F # Interactive Memory Leak

[1..10000000];; 
[1..10000000];; 
[1..10000000];; 
[1..10000000];; 
[1..10000000];; 
[1..10000000];; 
[1..10000000];; 
[1..10000000];; 
[1..10000000];; 

я получаю:

System.OutOfMemoryException: Exception of type 'System.OutOfMemoryException' was thrown. 

То же самое, если я префикс let x =. Кажется, что ссылки на высший уровень продолжают проводиться, какими бы недоступными они ни были. Есть ли способ очистить эти вещи, не теряя при этом удобства прохождения данных? Прямо сейчас я просто перезагружаюсь, чтобы очистить, но это неудобно.

+1

немного педантическую, но т шляпа не является утечкой памяти, ее просто как функции fsi. – mydogisbox

+0

@mydogisbox Согласно Википедии, «утечка памяти может произойти, когда объект хранится в памяти, но не может быть запущен текущим кодом». «Как он функционирует», в этом случае - утечка памяти. – Lamarth

+0

Ну, если вы выполняете тот же код не в fsi.exe, а в своей собственной исполняемой программе, он будет вести себя одинаково. – Petr

ответ

2

Поскольку вы готовы использовать let x = [1..10000000] затем использовать:

let mutable x = [1..10000000];; 

и повторно использовать память данных:

x <- [1..10000000];; 

и освободить использование памяти данных:

x <- [];; 
+0

Фантастический! Все, что мне нужно, это 'System.GC.Collect() ;;' и все это уходит! Скорее всего, он уйдет сам по себе, если я буду терпелив. – Lamarth

+0

Хорошо, это намного сложнее, чем просто это. "x <- \ n пусть y = [1..10000000] \ n 0 ;;" утечки, но «x <- \ n let y = [1..10000000] \ n List.head y ;;" (начинаются с «let mutable x = 0»). – Lamarth

2

Я не думаю, что есть способ очистить ссылки верхнего уровня в FSI. Вы можете увеличить объем памяти, который может использовать FSI, используя 64-битный режим для F # Interactive. В VisualStudio это "Сервис-Параметры-F # Tools-> F # Interactive" Настройки

+0

На самом деле, я фактически использую fsianycpu.exe, и я должен перезагрузиться, когда он пережевывает 20 ГБ или около того ОЗУ. – Lamarth

+0

Затем, используя изменяемую переменную в качестве предложенного @jyoung, возможно, может сделать трюк – Petr