Skocz do zawartości
  • 👋 Witaj na MPCForum!

    Przeglądasz forum jako gość, co oznacza, że wiele świetnych funkcji jest jeszcze przed Tobą! 😎

    • Pełny dostęp do działów i ukrytych treści
    • Możliwość pisania i odpowiadania w tematach
    • System prywatnych wiadomości
    • Zbieranie reputacji i rozwijanie swojego profilu
    • Członkostwo w jednej z największych społeczności graczy

    👉 Dołączenie zajmie Ci mniej niż minutę – a zyskasz znacznie więcej!

    Zarejestruj się teraz

Przełożenie na operacje pamięciowe


AutoIT Master

Rekomendowane odpowiedzi

Opublikowano

Znów natknąłem sie na problem. Autoit musi przewertować plik tekstowy, o 400.000 linijek, ważący 50 MB.

Robiąc najprostszy kod - program musi przewertować 0.5GB - czyli 10x ten plik tekstowy.

Operacja niestety trwa dość długo i każdorazowo wertuje 0.5GB informacji.

 

Kolejnym moim nieudanym sposobem było zapisanie kazdej z 400.000 linijek jako zmiennej

Na szczęście zadziałało - program teraz żre dużo ramu (tak miało być) ale nareszcie nie żre 50% procesora!

Lecz tym, co mnie przeraża jest czas ładowania programu... ładuje się ponad 2 godziny...

 

Kolejnym wyjściem było napisanie programu który zapisał mi każdą linijkę tekstu w formie zmiennej, potem wkleiłem to do programi...

O zgrozo! efekt był świetny, lecz program znów sie ładował prawie godzinę!

 

Kolejnym krokiem który chcę spróbować jest zapisanie 50MB dokumentu jako 1 zmienną i podzielenie jej poprzez linijki...

Ma ktoś pomysł jak to uczynić?

Opublikowano

użyj MySQL , najlepiej i najszybciej

 

cokolwiek nie zrobisz zmienne czy też i teksty i tak musisz załadować do pamięci albo ciągle ładować po trochę sprawdzając czy jest to co potrzebujesz albo będzieszże potrzebował albo zapisujesz

If you = stupid then

insert(foot.in.your.ass)

end if

licznik-54-96732-stat.png

Opublikowano

Taki tekst o długości 400 tysięcy linijek nie ma prawa w przyrodzie istnieć. Nawet "W pustyni i w puszczy" jest krótszy. Możesz go tu wkleić jako poparcie swojej urojonej tezy(?).

 

 

I nie dwie godziny tylko pare miliardowych sekundy

masz tu prosty przykład ze się w takim czasie da:

 

http://www.autoitscript.com/forum/topic/131611-scite-helper/page__p__916326

Opublikowano

Taki tekst o długości 400 tysięcy linijek nie ma prawa w przyrodzie istnieć. Nawet "W pustyni i w puszczy" jest krótszy. Możesz go tu wkleić jako poparcie swojej urojonej tezy(?).

 

 

I nie dwie godziny tylko pare miliardowych sekundy

masz tu prosty przykład ze się w takim czasie da:

 

http://www.autoitscript.com/forum/topic/131611-scite-helper/page__p__916326

 

ładuje się 2 godziny w ten spsób

 

For $i = 0 to 400000

$x[$i] = FileReadLine('replaced.txt',$i)

Next

 

Chciałem ci wysłać tekst w spoilerze, lecz gdy wkleiłem ten tekst przeglądarka mi się kompletnie scrashowała, zabierała 50% procesora i 2gb ramu więc wklejam ten plik jako do pobrania

http://www.speedyshare.com/files/30741707/replaced.rar

Skan: http://www.virustotal.com/file-scan/report.html?id=c98166d8dc0de2da49b67a4dd331a41841eaee78673573259e5875f7da0cf9f6-1318593932

 

Gdyby ktokolwiek otworzył spoiler również miałby crasha więc...

Opublikowano

moze podziel ten plik na kilka mniejszych i wedlug potrzeby niech bedzie przegladany tylko jeden z X plików

Do
$wiek+=1
Until ŻycieGetMsg() = -3

zbieram +

Opublikowano

moze podziel ten plik na kilka mniejszych i wedlug potrzeby niech bedzie przegladany tylko jeden z X plików

 

To nierealne, dzieliłem go już na mniejsze, ale i tak musi przewertowąć każdy i tak więc wyjście dziwne

 

 

w nocy spróbuję sposobem robem'a z MySQL ;x

Opublikowano

Napisz w innym języku, autoit jest za wolny do takich rzeczy.

 

Właśnie mam duży dylemat który język zacząć

 

Chcę by był bardzo szybki, oczywiście wielowątkowy i na wiele platform... nie tylko na winde.

 

Wacham się długo nad językami - mógłbyś podpowiedzieć jakiś? ( + zaawansowany tut lub 'spis funkcji' jaki jest w helperze)

 

Edit

 

Właśnie poprzez wolność autoita porzuciłem chyba 5 doskonałych projektów..

Opublikowano

Jest dużo ciekawych bibliotek do c++, które umożliwiają prostsze tworzenie GUI niż używając WINAPI. Albo nawet poprzez edytor, coś jak KODA.

Do c++ jest dobra dokumentacja (MSDN), jest po ang. ale nie powinno Ci to sprawiać problemu.

Do tego c++ jest wielo platformowy, do obliczeń, w których zależy Ci na szybkości możesz zawsze wrzucić wstawki z assemblera. (algorytmy itp.) (w autoit, co prawda też się da, ale i tak będzie to chyba wolniejsze niż normalny kod w assemblerze.)

Ogólnie jest to najlepszy język, można w nim zrobić praktycznie wszystko.

Jako środowisko polecam Visual C++ (jakiś z nowszych) lub Code::Blocks

Opublikowano

Popełniasz duży błąd odczytując każdą linijke osobno.

 

 

Odczytaj cały plik jeden raz, a póżniej dziel to już w pamięci ram.

 

Będzie o wieeele szybciej.

Opublikowano

tego jest nie 400 tys tylko prawie 4 miliony

 

przy tej ilości pewnie to nie przejdzie, ale możesz przetestować i napisać czy sie udało bo sam jestem ciekaw:

 

zrobić plik pomocy lista.ini

 

[wyrazy]
aaa=tu obojente moze byc "aaa" a moze samo "1"
bbb=tralalala
ccc=true
ddd=ddd
eee=eee

 

a potem sprawdzać czy wyraz istnieje za pomocą IniRead

 

$szukane = "bbb"
$wynik = IniRead("lista.ini", "wyrazy", $szukane, "")

if $wynik then
   MsgBox(0,'','istnieje')
Else
   MsgBox(0,'','brak')
endif

Opublikowano

Plik ma 7,5 mb spakowany rar'em. Może w jakiś sposób skomepresuj ten plik, i wczytaj do pamięci skompresowany.

 

I w pamięci byś to rozpakowywał.

Opublikowano

@up, z tym może nie być problemu, bo jest udf do obsługi 7zipa (używa kernel32.dll), ale przy wczytywaniu całego pliku i późniejszym dzieleniu go, chyba różnica będzie niewielka. Jutro spróbuje coś wymyśleć i przetestować różne możliwości, może znajdę jakiś sposób na osiągniecie dobrego wyniku.

Opublikowano

Wszystkie sposoby omówione wyżej przeszły mi przez głowę...

 

7 zip raczej odpada, bo samo rozpakowanie żarłoby masakryczne ilości zasobów, ale spróbować warto :)

 

chcąc spróbować sposób od dzioba tukana zdałem sobie sprawe że przekonwertowanie tych wszystkich słów zajełoby wieki...

 

Dzięki za chęć pomocy :D

Opublikowano

U mnie dość szybko wczytał przy pomocy _FileReadToArray() (cały plik, mniej niż 10 sek)

Tablica zawiera poszczególne linijki.

 

Można też wczytać za pomocą fileread() i pozmieniać litery w tekście (stringreplace()) nie rozdzielając go na linie i potem zapisać filewrite(), akapity zostaną zachowane.(domyślam się, że chodzi o kodowanie, któro nie obsługuje polskich znaków diakrytycznych.)

Opublikowano

zdałem sobie sprawe że przekonwertowanie tych wszystkich słów zajełoby wieki...

dla jednych wiek dla innych 2 sek

nie wiem jaki problem widzisz w dopisaniu do kazdego wyrazu na końcu "=1"

plik jakiś dziwny przez co trzeba bylo 3 razy StringReplace użyć

 

$path = "replaced.txt"
$text = FileRead($path)
FileDelete($path)
$text = StringReplace($text, @cr, @lf)
$text = StringReplace($text, @lf, @crlf)
$text = StringRegExpReplace($text, '(\r\n){2,}', @crlf)
$text = StringReplace($text, @crlf, "=1" & @crlf)
;$text = StringRegExpReplace($text, "\r\n([[:space:]]+)", @CRLF) ; jesli spacje na poczatku w kazdej lini ci przeskadzaja uzyj tego
FileWrite($path, $text)

 

 

tylko potem dopisz na początku w pierwszej linii

[wyrazy]

 

 

 

/:edit

heh widzę ze IniRead (z poprzedniego przykładu) odczytuje jednak to szybciej niż się spodziewałem a liczba linii nie ma znaczenia

Opublikowano

dla jednych wiek dla innych 2 sek

nie wiem jaki problem widzisz w dopisaniu do kazdego wyrazu na końcu "=1"

plik jakiś dziwny przez co trzeba bylo 3 razy StringReplace użyć

 

$path = "replaced.txt"
$text = FileRead($path)
FileDelete($path)
$text = StringReplace($text, @cr, @lf)
$text = StringReplace($text, @lf, @crlf)
$text = StringRegExpReplace($text, '(\r\n){2,}', @crlf)
$text = StringReplace($text, @crlf, "=1" & @crlf)
;$text = StringRegExpReplace($text, "\r\n([[:space:]]+)", @CRLF) ; jesli spacje na poczatku w kazdej lini ci przeskadzaja uzyj tego
FileWrite($path, $text)

 

 

tylko potem dopisz na początku w pierwszej linii

[wyrazy]

 

 

 

/:edit

heh widzę ze IniRead (z poprzedniego przykładu) odczytuje jednak to szybciej niż się spodziewałem a liczba linii nie ma znaczenia

 

 

Dzięki, dałoby się jeszcze napisać kod, który by dawał na początku numer linijki = <treść linijki>

 

spacji się pozbyłem dawno ;D

 

//repkę dam wam jutro (limit) o ile wgl. takową zbieracie xD

Zarchiwizowany

Ten temat przebywa obecnie w archiwum. Dodawanie nowych odpowiedzi zostało zablokowane.

×
×
  • Dodaj nową pozycję...