Что нового

Какие есть средства ,способы ,команды для ускорения работы программы "перевертыша" ?

polzovatelau

Новичок
Сообщения
15
Репутация
0
Есть файл с любыми данными например "В лесу родилась "После работы программы получаем необходимый результат "ьсалидор усел В" При совсем малых размерах файла до 1000 байт работает сносно . При 20к считает уже 50 мин . Многовато будет . В программе используются операторы FileOpen FileRead(.FileWrite .Просто осуществляется последовательное побайтовое считывание с одного файла и побайтовое в другой .Можно ли ускорить этот процесс ?
 

Tempo

AutoIT Гуру
Сообщения
616
Репутация
205
Код:
;~ AutoIt Version: 3.3.14.5
#include <FileConstants.au3>
Local $sFile = FileOpenDialog("", "", "Все (*.*)", $FD_FILEMUSTEXIST)
If @error Then Exit

Local $sReverse = StringReverse(FileRead($sFile))
Local $hFile = FileOpen($sFile, $FO_OVERWRITE + $FO_UTF8)
FileWrite($hFile, $sReverse)
FileClose($sFile)
ShellExecute($sFile)
 
Последнее редактирование:
Автор
P

polzovatelau

Новичок
Сообщения
15
Репутация
0
Большое спасибо !
( Что 5 байт что 50Мб программа работает отлично .Единственное что после 52Мб начинаются проблемы с памятью.Error allocating memory Интересно это проблемы моего компьютера или ограничения Autoit ? )
 
Последнее редактирование:

xXx

╚{■_■}╗
Меценат
Сообщения
248
Репутация
95
начинаются проблемы с памятью.
Попробуйте:
Код:
; ...
Local $sReverse = _StringReverse(FileRead($sFile))
; ...
Func _StringReverse($s_String)
    Local $RS = Chr(30)
    $s_String = StringRegExpReplace($s_String, '(\r\n)', $RS)

    Local $i_len = StringLen($s_String)
    If $i_len < 1 Then Return SetError(1, 0, "")

    Local $t_chars = DllStructCreate("char[" & $i_len + 1 & "]")
    DllStructSetData($t_chars, 1, $s_String)

    Local $a_rev = DllCall("msvcrt.dll", "ptr:cdecl", "_strrev", "struct*", $t_chars)
    If @error Or $a_rev[0] = 0 Then Return SetError(2, 0, "")

    Return StringRegExpReplace(DllStructGetData($t_chars, 1), $RS, @CRLF)
EndFunc   ;==>_StringReverse
 
Последнее редактирование:
Автор
P

polzovatelau

Новичок
Сообщения
15
Репутация
0
Откройте диспетчер задач и проверьте потребление памяти
2 Гиг до мах в запасе (занято ~6 из 8 Работающий скрипт потребляет ~4 Гига.) .Что интересно сообщение Error allocating memory не одно а тем больше чем больше превышение над граничным ~52 Мбайт программы .
Сообщение автоматически объединено:

Скрипт видимых действий не производит . Честно сказать пока сам разобраться в нем не могу .
 
Последнее редактирование:

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
код возвращает строку. её остается только записать
 

xXx

╚{■_■}╗
Меценат
Сообщения
248
Репутация
95
сам разобраться в нем не могу
Я имел ввиду заменить вызов функции StringReverse(), в скрипте поста #2, на _StringReverse() - это немного измененная ф-я из UDF Autoit v 3.3.8.1.
Т.е. нужно было сделать так:
Код:
#include <FileConstants.au3>
Local $sFile = FileOpenDialog("", "", "Все (*.*)", $FD_FILEMUSTEXIST)
If @error Then Exit

Local $sReverse = _StringReverse(FileRead($sFile))
Local $hFile = FileOpen($sFile, $FO_OVERWRITE + $FO_UTF8)
FileWrite($hFile, $sReverse)
FileClose($sFile)
ShellExecute($sFile)

Func _StringReverse($s_String)
    Local $RS = Chr(30)
    $s_String = StringRegExpReplace($s_String, '(\r\n)', $RS)

    Local $i_len = StringLen($s_String)
    If $i_len < 1 Then Return SetError(1, 0, "")

    Local $t_chars = DllStructCreate("char[" & $i_len + 1 & "]")
    DllStructSetData($t_chars, 1, $s_String)

    Local $a_rev = DllCall("msvcrt.dll", "ptr:cdecl", "_strrev", "struct*", $t_chars)
    If @error Or $a_rev[0] = 0 Then Return SetError(2, 0, "")

    Return StringRegExpReplace(DllStructGetData($t_chars, 1), $RS, @CRLF)
EndFunc   ;==>_StringReverse
 
Последнее редактирование:
Автор
P

polzovatelau

Новичок
Сообщения
15
Репутация
0
код возвращает строку. её остается только записать
Спасибо .
(Буду разбираться в данном направлении )
Сообщение автоматически объединено:

Я имел ввиду заменить вызов функции StringReverse(), в скрипте поста #2, на _StringReverse() - это немного измененная ф-я из UDF Autoit v 3.3.8.1.
Т.е. нужно было сделать так:
Код:
#include <FileConstants.au3>
Local $sFile = FileOpenDialog("", "", "Все (*.*)", $FD_FILEMUSTEXIST)
If @error Then Exit

Local $sReverse = _StringReverse(FileRead($sFile))
Local $hFile = FileOpen($sFile, $FO_OVERWRITE + $FO_UTF8)
FileWrite($hFile, $sReverse)
FileClose($sFile)
ShellExecute($sFile)

Func _StringReverse($s_String)
    Local $RS = Chr(30)
    $s_String = StringRegExpReplace($s_String, '(\r\n)', $RS)

    Local $i_len = StringLen($s_String)
    If $i_len < 1 Then Return SetError(1, 0, "")

    Local $t_chars = DllStructCreate("char[" & $i_len + 1 & "]")
    DllStructSetData($t_chars, 1, $s_String)

    Local $a_rev = DllCall("msvcrt.dll", "ptr:cdecl", "_strrev", "struct*", $t_chars)
    If @error Or $a_rev[0] = 0 Then Return SetError(2, 0, "")

    Return StringRegExpReplace(DllStructGetData($t_chars, 1), $RS, @CRLF)
EndFunc   ;==>_StringReverse
Спасибо.
(Буду разбираться с Func )
(
 
Верх