logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

OpenCalc obliczanie ilości duplikatów. 700tyś wierszy

franz87 01 Lut 2015 19:31 1167 12
REKLAMA
  • #1 14392094
    franz87
    Poziom 16  
    Posty: 397
    Ocena: 82
    Witam,
    Mam 700.000 wierszy w kolumnie A w Open Calc.
    Są to słowa. Chciałbym, żeby w kolumnie B obok każdego słowa wyświetlała się ilość jego powtórzeń w całej kolumnie A.

    Czyli np.
    A B
    adam 3
    wojtek 2
    grzegorz 1
    adam 3
    jan 1
    łukasz 1
    wojtek 2
    adam 3

    w kolumnie B używam =LICZ.JEŻELI(A$1:A$700000 ; A1)
    Niestety gdy chcę wykonać obliczanie dla całej kolumny B Calc się zawiesza.
    Widocznie 700.000 wierszy do przelecenia za każdym razem to za dużo.


    Jak w inny sposób sobie poradzić. Inna fukcja w Calcu? Inny program? Poprzez bazę danych?
  • REKLAMA
  • #2 14392620
    yogi009
    Poziom 43  
    Posty: 14697
    Pomógł: 848
    Ocena: 2654
    Kłopot polega m.in. na tym, że tym sposobem nakłaniasz arkusz, aby przy każdym dotknięciu klawisza wszystko przeliczał od nowa. Być może potrzebujesz takiej aplikacji, żeby śledzić te ilości powtórzeń na bieżąco, ale gdyby się okazało, że nie, to jest kilka innych pomysłów. Może to być filtr, może być makro obliczające po jego wywołaniu. Z drugiej strony wykonanie tej operacji teoretycznie powinno mocno spowolnić pracę arkusza, ale czy zawieszać, to już nie jestem pewny.
  • #3 14392760
    diseasekowalski
    Poziom 35  
    Posty: 3047
    Pomógł: 180
    Ocena: 189
    Ja robię to tak, że w kolumnie obok sprawdzam zawartość komórki, jeżeli jest wg wzorca ($A-z$x) to 1, jeśli nie to 0/nic. Następnie sumuję zawartość kolumny dla poszczególnych wzorców. Do 200 tyś działa z lekkimi zacięciami na E7400 z 2GB Ram. Z 4GB jest deko lepiej. Ale ja nie operuję na tych danych, tylko liczę gotowe.

    Jeśli operujesz na tych danych i edytujesz je - makro z wywołaniem będzie pewnie najlepszą opcją.
  • #4 14393673
    franz87
    Poziom 16  
    Posty: 397
    Ocena: 82
    yogi009 napisał:
    Być może potrzebujesz takiej aplikacji, żeby śledzić te ilości powtórzeń na bieżąco, ale gdyby się okazało, że nie, to jest kilka innych pomysłów. Może to być filtr, może być makro obliczające po jego wywołaniu. Z drugiej strony wykonanie tej operacji teoretycznie powinno mocno spowolnić pracę arkusza, ale czy zawieszać, to już nie jestem pewny.


    Chcę jednorazowo sprawdzić ilość duplikatów dla danego słowa.
    Tylko właśnie jakiego filtru,makra użyć.
    Pisać makr nie potrafię.

    yogi009 napisał:
    Z drugiej strony wykonanie tej operacji teoretycznie powinno mocno spowolnić pracę arkusza, ale czy zawieszać, to już nie jestem pewny.


    Wcześniej robiłem to dla 50.000 słów i Calc obliczał to ~30 minut.
    Teraz miałem komputer włączony 13h i nie dał rady obliczyć tych 700.000
    Open Calc zwiesza się (Brak odpowiedzi).
    Sprawdzane na dwóch komputerach (2rdzenie procesor,4GB ram).
    Od biedy mógłbym posortować słowa alfabetycznie i podzielić te słowa na mniejsze "pakiety" np. po 50.000 i robić to "krok po kroku". Ale pewnie zajęłoby to kilka godzin. Najlepiej byłoby znaleźć rozwiązanie, bo być może w przyszłości chciałbym to powtórzyć dla innego pakietu słów...

    diseasekowalski napisał:

    Ja robię to tak, że w kolumnie obok sprawdzam zawartość komórki, jeżeli jest wg wzorca ($A-z$x) to 1, jeśli nie to 0/nic. Następnie sumuję zawartość kolumny dla poszczególnych wzorców.

    Jeżeli dobrze zrozumiałem to w moim wypadku to nie zadziała...
  • REKLAMA
  • #5 14393741
    diseasekowalski
    Poziom 35  
    Posty: 3047
    Pomógł: 180
    Ocena: 189
    Jaki to komputer? Jaki system?

    Ilość tych słów jest znana? Jeśli tak, to ile ich jest?
  • #6 14393794
    adamas_nt
    VIP Zasłużony dla elektroda
    Posty: 5320
    Pomógł: 1508
    Ocena: 659
    franz87 napisał:
    Pisać makr nie potrafię.
    Zdarza się...
    Jak wstawić moduł i przekopiować kod znajdziesz w pomocy.

    Zapisz plik z załącznika i rozpakuj. Makra OO nie działają z TEMP.

    Najdłużej "pójdzie" pierwszy przebieg wewnętrznej pętli. Wstawiłem instrukcję warunkową, która trafiając na policzony już String - przekopiuje wartość i przejdzie do następnego.

    Sam jestem ciekaw jaki będzie czas całkowity przy 700k wierszy ;)
    Załączniki:
    • Bez_tytu__u_1.zip (5.78 KB) Musisz być zalogowany, aby pobrać ten załącznik.
  • #7 14396226
    franz87
    Poziom 16  
    Posty: 397
    Ocena: 82
    @adamas_nt
    Nie radze sobie z odpalaniem tego makra.
    Rozpakowałem twoje archiwum daje Alt+F11 ale nie widzę twojego makra.
    W "Moje markra" jest jedno domyślne "Main" puste. Jaka jest jego nazwa?
    Mam zrobiony przycisk, ale nie wiem jakie marko do niego przypisać...
  • #8 14396813
    adamas_nt
    VIP Zasłużony dla elektroda
    Posty: 5320
    Pomógł: 1508
    Ocena: 659
    Sorki, zapisało mi do MyMacros :(

    Tu poprawiony
    Załączniki:
    • Bez_tytu__u_1.zip (7.03 KB) Musisz być zalogowany, aby pobrać ten załącznik.
  • REKLAMA
  • #9 14405464
    franz87
    Poziom 16  
    Posty: 397
    Ocena: 82
    Witam,
    No niestety twoje makro działa na pewno szybciej niż LICZ.JEŻELI, ale po kilku godzinach obliczyło dopiero 10.000 wierszy.
    Mam pomysł jak by to mogło działać dużo szybciej, ale nie znam VBA do mark i zaczynam go dopiero ogarniać. Chyba, że komuś chciałoby się to zaimplementować... Pomysł jest taki.

    Słowa są posortowane alfabetycznie.
    Program bierze pierwsze słowo i sprawdza czy te pod nim (następne) jest takie samo.

    Jeżeli tak - inkrementuje licznik.

    Jeżeli nie - czyli jeżeli dojdzie do następnego słowa to przerywa inkrementacje. Odejmuje wartość inkrementacji(licznika) od wiersza w którym się znajduje np. zatrzymał się na komórce A1000 i licznik wskazywał wtedy 250. To wiadomo, że od A750:A1000 jest słowo "jakies". Wówczas w B750:B1000 może wpisać wartość "250".
    I tak do końca....

    Zacząłem kurs VBA, ale już jest zgrzyt, bo jest inna składnia niż w MS Excel pod którego są robione wszystkie kursy (ja mam OO).

    @adamas_nt - twój kod byłby dobry dla mniejszej ilości słów. Jest dużo wydajnieszy od LICZ.JEŻELI - to pewne, ale 700.000 to za dużo.
    Jeżeli ktoś zrozumiał pomysł, który opisałem wyżej i chciałby to zaimplementować do VBA to było by super. Zaoszczędził bym dużo czasu i zbędnych kolejnych pytań.Pozdrawiam
  • REKLAMA
  • Pomocny post
    #10 14405664
    adamas_nt
    VIP Zasłużony dla elektroda
    Posty: 5320
    Pomógł: 1508
    Ocena: 659
    Oj rzeczywiście. Na próbce ~2000 wierszy makro, na mojej maszynie (przed uruchomieniem należy usunąć dane z kolumny B/Arkusz1), potrzebuje... mnóstwo sekund.

    Twój pomysł, zdaje się, przedni. "Poruszając się" od ostatniego wiersza w górę, po posortowanej kolumnie, makro działa jakby, hmm... nieco szybciej.

    Tu porównanie czasów:
    OpenCalc obliczanie ilości duplikatów. 700tyś wierszy OpenCalc obliczanie ilości duplikatów. 700tyś wierszy
    Załączniki:
    • Bez_tytu__u_3.zip (8.4 KB) Musisz być zalogowany, aby pobrać ten załącznik.
  • #11 14407639
    marek003
    Poziom 40  
    Posty: 4607
    Pomógł: 801
    Ocena: 488
    Nie oszukujcie się 700k wierszy to musi trwać.

    Ostatnio na 10k w e2010 i z licz.warunki() trwało 6 minut.
    700k/10k=70
    70*6min=420min
    420min/60=7godzin

    Z doświadczenia (mojego) wynika że funkcje wbudowane działąją i tak szybciej niż makro.

    Powiedzmy że z twoją funkcją (bo to licz.jeżeli()) zaoszczędzisz ok. godzinę.

    Niestety to musi trwać.

    Może spróbuj nie arkuszem a baza danych - ale nie wiem czy będzie szybciej.
  • #12 14408175
    franz87
    Poziom 16  
    Posty: 397
    Ocena: 82
    marek003 napisał:
    Nie oszukujcie się 700k wierszy to musi trwać.

    Ostatnio na 10k w e2010 i z licz.warunki() trwało 6 minut.
    700k/10k=70
    70*6min=420min
    420min/60=7godzin

    Z doświadczenia (mojego) wynika że funkcje wbudowane działąją i tak szybciej niż makro.

    Powiedzmy że z twoją funkcją (bo to licz.jeżeli()) zaoszczędzisz ok. godzinę.

    Niestety to musi trwać.

    Może spróbuj nie arkuszem a baza danych - ale nie wiem czy będzie szybciej.


    Nie do końca się zgodzę. Licz.Jeżeli() była włączona 13h i zrobiła może z 10%.
    Kod, który zaimplementował mi teraz @adamas_nt obliczył 700.000 wierszy w 1h33min więc różnica jest ogromna.

    To, że takie obliczanie musi trwać to wiadomo :) Teraz sortuje ponownie wyniki i też czekam dobre 20 minut.

    Może baza danych była by rzeczywiście pomysłem lepszym.
    W każdym razie dziękuje za pomoc (w szczególności @adamas_nt za zaimplementowanie mojego algorytmu.
    Pozdrawiam
  • #13 14408634
    yogi009
    Poziom 43  
    Posty: 14697
    Pomógł: 848
    Ocena: 2654
    Skoro masz prawie milion rekordów i chcesz je wszystkie w jakimś celu przeanalizować, to wiadomo od razu, że baza danych ze swoimi algorytmami będzie lepszym rozwiązaniem. Tylko kto tą bazę teraz postawi? :-)

Podsumowanie tematu

LABEL_AI_GENERATED
Użytkownik ma problem z obliczeniem ilości duplikatów słów w 700.000 wierszach w OpenCalc, co powoduje zawieszanie się programu przy użyciu funkcji =LICZ.JEŻELI. Proponowane rozwiązania obejmują użycie makr, które mogą przyspieszyć obliczenia, a także sortowanie danych alfabetycznie i dzielenie ich na mniejsze pakiety. Użytkownicy sugerują, że makra mogą działać szybciej niż wbudowane funkcje, a także rozważają użycie baz danych jako alternatywy dla OpenCalc. Wskazano, że obliczenia mogą trwać długo, ale zastosowanie odpowiednich algorytmów może znacznie przyspieszyć proces.
Podsumowanie AI na podstawie dyskusji. Może zawierać błędy.
REKLAMA