Что нового

Увеличение файла подкачки

lightforever

Новичок
Сообщения
37
Репутация
2
При выполнении данного скрипта уровень расхода оперативной памяти увеличивается чуть ли не в геометрической прогрессии( и естественно возникает ошибка распределения памяти). Не могу понять почему

Код:
$a=0
While 1
	$a+=1
	update_file('E:\\1\\'&$a&'.txt',1,1)
WEnd

Func update_file($file_path,$opp_need_update=False,$made_need_update=False)
	Local $detail_file
	Local $made,$opp
	
	$detail_file=FileOpen($file_path,0)
					if $detail_file==-1 Then ;ФАЙЛА ПОКА НЕТ
						$detail_file=FileOpen($file_path,2)
						FileWriteLine($detail_file,0)
						FileWriteLine($detail_file,0)
						FileClose($detail_file)
						
						$detail_file=FileOpen($file_path,0)
					EndIf;ФАЙЛА ПОКА НЕТ
		$made=FileReadLine($detail_file)
		$opp=FileReadLine($detail_file)
		
		FileClose($detail_file)
		
		$detail_file=FileOpen($file_path,2)
		    FileWriteLine($detail_file,$made+$made_need_update)
			FileWriteLine($detail_file,$made+$opp_need_update)
		FileClose($detail_file)
		
	
EndFunc
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8 472
Репутация
2 401
Ну а как ты хотел, в цикле постоянно обращаться к файлам без нагрузки на память?

Хотябы так:

Код:
While 1
    $a+=1
    update_file('E:\\1\\'&$a&'.txt',1,1)
    Sleep(1000)
WEnd
 

dwerf

Использует ArchLinux
Сообщения
478
Репутация
218
CreatoR сказал(а):
Ну а как ты хотел, в цикле постоянно обращаться к файлам без нагрузки на память?
Однако нагрузка на процессор, а не на память.

Я немного поигрался с этим скриптом - память растёт, когда FileOpen возвращает -1 (т.е. ошибка при чтении).
Я подумал что handle для не открытого файла всё же создаётся, но так как возвращается -1 закрыть его уже не получается. Может баг AutoIt может винды.

Короче пользуйтесь FileExists

Код:
$a=0
While 1
	$a+=1
	update_file('E:\\1\\'&$a&'.txt',1,1)
WEnd

Func update_file($file_path, $opp_need_update=False, $made_need_update=False)
	Local $detail_file
	Local $made,$opp

	If FileExists($file_path) Then
		$detail_file = FileOpen($file_path)
		$made = FileReadLine($detail_file)
		$opp = FileReadLine($detail_file)
		FileClose($detail_file)
	Else
		$made = 0
		$opp = 0
	EndIf

	$detail_file = FileOpen($file_path,2)
	FileWriteLine($detail_file, $made+$made_need_update)
	FileWriteLine($detail_file, $made+$opp_need_update)
	FileClose($detail_file)
EndFunc
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8 472
Репутация
2 401
dwerf [?]
Однако нагрузка на процессор, а не на память.
Упс, перепутал. Мне показалось речь о процессоре.
Но пауза всё равно нужна :blum:
 
Автор
L

lightforever

Новичок
Сообщения
37
Репутация
2
dwerf
Спасибо, да интересно получается. У меня тоже была мысль про баг с хэндлом, т.к. реализация этого скрипта на C++ идёт без ошибок
 

dwerf

Использует ArchLinux
Сообщения
478
Репутация
218
« Последнее редактирование: Сегодня в 21:14:08 от lightforever, Причина: Объединение сообщений »
Проверял, только с update_file(@ScriptDir & '\' & $a & '.txt',1,1).
Стабильно 5 мб.

Код:
$a=0
While 1
    $a+=1
    update_file(@ScriptDir & '\' & $a & '.txt',1,1)
WEnd

Func update_file($file_path, $opp_need_update=False, $made_need_update=False)
    Local $detail_file
    Local $made,$opp

    If FileExists($file_path) Then
        $detail_file = FileOpen($file_path)
        $made = FileReadLine($detail_file)
        $opp = FileReadLine($detail_file)
        FileClose($detail_file)
    Else
        $made = 0
        $opp = 0
    EndIf

    $detail_file = FileOpen($file_path,2)
    FileWriteLine($detail_file, $made+$made_need_update)
    FileWriteLine($detail_file, $made+$opp_need_update)
    FileClose($detail_file)
EndFunc
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5 379
Репутация
2 711
Исходный пример больше похож на стресс-тест для FileOpen(). Просто оптимизируйте (упростите) код...

Код:
Func update_file($file_path, $opp_need_update = 0, $made_need_update = 0)

	Local $Data = FileRead($file_path)

	If @error Then
		FileWrite($file_path, $made_need_update & @CRLF & $opp_need_update & @CRLF)
	Else
		$Data = StringSplit(StringStripCR($Data), @LF, 2)
		FileDelete($file_path)
		FileWriteLine($file_path, ($Data[0] + $made_need_update) & @CRLF & ($Data[1] + $opp_need_update) & @CRLF)
	EndIf
EndFunc   ;==>update_file
 
Верх