Что нового

[Процессы] Ограничить потребление памяти при разделении файла

joiner

Модератор
Локальный модератор
Сообщения
3 339
Репутация
574
использовал скрипт для разделения файла на части http://autoit-script.ru/index.php/topic,3925.msg30927.html#msg30927
в моем случае не получается назначит значение больше чем
Код:
$iMax = 1024 * 1024 * 300

физической памяти на компе 1,75ГБ.
файл подкачки задан в диапазоне 2046-4092
если задать значение хотя бы
Код:
$iMax = 1024 * 1024 * 400

то вылетает ошибка из которой я понял, что обнаружена нехватка памяти. ( надеюсь правильно понял). в обычном режиме диспетчер задач показывает порядка 390мб загрузки памяти.
как избежать такого потребления памяти, но при этом управлять значениями разделения файла. к примеру файл 1.6Гб мне нужно разделить пополам.
 

madmasles

Модератор
Глобальный модератор
Сообщения
7 790
Репутация
2 319
Александр [?]
как избежать такого потребления памяти, но при этом управлять значениями разделения файла
Попробуйте так:
1. Разделить.
Код:
$sFile = @ScriptDir & '\VeryBigFile.avi'
$iPart = 2 ;делим на 2 части
$iMaxRead = 1024 * 1024 * 10 ;читаем по 10 Мб

$sFolderName = StringRegExpReplace($sFile, '^.*\.', '') & '_' & StringRegExpReplace($sFile, '.*\\|\.[^.]*$', '')
$sNewName = StringRegExpReplace($sFile, '.*\\|\.[^.]*$', '')
$iSize = FileGetSize($sFile)
$iPartSize = Ceiling($iSize / $iPart)
If $iMaxRead > $iPartSize Then $iMaxRead = $iPartSize
$hFile = FileOpen($sFile, 16)
For $i = 1 To $iPart
	$hTempFile = FileOpen(@ScriptDir & '\' & $sFolderName & '\' & $i & '_' & $sNewName & '.xyz', 26)
	$iSizeRead = 0
	$iRead = $iMaxRead
	While $iSizeRead < $iPartSize
		$sTempText = FileRead($hFile, $iRead)
		FileWrite($hTempFile, $sTempText)
		$iSizeRead += $iRead
		If $iRead > $iPartSize - $iSizeRead Then $iRead = $iPartSize - $iSizeRead
	WEnd
	FileClose($hTempFile)
Next
FileClose($hFile)

IniWrite(@ScriptDir & '\' & $sFolderName & '\' & 'File.ini', 'File', 'FileName', StringRegExpReplace($sFile, '^.*\\', ''))
IniWrite(@ScriptDir & '\' & $sFolderName & '\' & 'File.ini', 'File', 'FilePart', $iPart)

2. Соединить.
Код:
$iMaxRead = 1024 * 1024 * 10
$sFile = IniRead(@ScriptDir & '\File.ini', 'File', 'FileName', '')
$iPart = Number(IniRead(@ScriptDir & '\File.ini', 'File', 'FilePart', ''))

If Not $iPart Or Not $sFile Then
	MsgBox(16, 'Error', 'Error')
	Exit
EndIf
$sName = StringRegExpReplace($sFile, '.*\\|\.[^.]*$', '')
$hFile = FileOpen(@ScriptDir & '\' & $sFile, 17)

For $i = 1 To $iPart
	$iError = 0
	$hTempFile = FileOpen(@ScriptDir & '\' & $i & '_' & $sName & '.xyz', 16)
	While $iError <> -1
		$sTempText = FileRead($hTempFile, $iMaxRead)
		$iError = @error
		FileWrite($hFile, $sTempText)
	WEnd
	FileClose($hTempFile)
Next
FileClose($hFile)
 
Автор
joiner

joiner

Модератор
Локальный модератор
Сообщения
3 339
Репутация
574
madmasles [?]
$iMaxRead = 1024 * 1024 * 10
почему 10? если изменить значение на что это повлияет? на скорость деления или на использование оперативы?
 

madmasles

Модератор
Глобальный модератор
Сообщения
7 790
Репутация
2 319
Александр [?]
почему 10? если изменить значение на что это повлияет? на скорость деления или на использование оперативы?
Читаем по 10 Мб. Поменяйте на большее значение - будет больше памяти потреблять, на меньшее - меньше.
 
Верх