koneser69
11.03.2014, 13:38:22
Witam
Muszę napisać aplikację w php która odbiera dane i zapisuje do pliku.
Danych jest bardzo dużo - powstają pliki po około 1MB.
Problem jest w tym, że odbierane dane nie są wysyłane w sortowanej kolejności. Jak zapisuję to co odbieram to otrzymuję.
TIME:154459
TIME:002225
TIME:154458
TIME:002254
TIME:002354
TIME:002324
Chciałbym aby podczas zapisu od razu dane zostały posortowane.
TIME:154459
TIME:154458
TIME:002354
TIME:002324
TIME:002255
TIME:002224
Czy ktoś zna wydajny a zarazem bezpieczny sposób na rozwiązanie mojego problemu?
Blackhole
11.03.2014, 13:40:45
Jak są te dane odbierane? Przed wysłaniem ich (jakim sposobem) przechowujesz je tymczasowo?
YourFrog
11.03.2014, 13:44:19
Muszą być pliki czy może być np baza danych ? Tam tego problemu by nie było.
Jeżeli zaś chodzi o pliki. To jedyne rozwiązanie jakie mi się nasuwa to za każdym razem przy zapisie poszukiwać odpowiedniego wiersza w którym należy wstawić. Biorąc pod uwagę że będzie to plik uporządkowany to można użyć algorytmu dziel i zwyciężaj.
Co to bezpieczeństwa. Gdy będziesz blokował plik przy otwarciu i zdejmował blokadę przy zapisie to nic się nie stanie.
koneser69
11.03.2014, 15:28:27
Dane odbieram z portu socketami. Nie przechowuję ich tymczasowo. Odbieram i zapisuję.
Bazy danych odpadają nie wytrzymią tego.
YourFrog czy masz gdzieś przykład kodu który będę mógł wykorzystać.
Crozin
11.03.2014, 15:30:56
Cytat
Bazy danych odpadają nie wytrzymią tego.
Ciekawi mnie skąd taki wniosek, szczególnie w kontekście tematu dot. zwykłego pliku tekstowego.
Wazniak96
11.03.2014, 16:36:04
Jeśli odbierasz dane jako jedna zmienna, i każda wartość jedna pod drugą to:
Jak nie to sobie przerób
PS: Zastanów się rzeczywiście czy nie umieścić danych w bazie...
sazian
11.03.2014, 19:34:13
ile masz dokładniej tych danych ? napisałeś że są to pliki po około 1MB ale z jaką częstotliwością zbierasz te dane ?
Czy to 1MB masz co sekundę ? dwie ? dziesięć? co minutę ?
Jeśli upierasz przy plikach, a przy tym nie potrzebujesz dostępu do tych danych poprzez plik natychmiast to możesz użyć jakiegoś systemu cache w pamięci ram(np. APC). Wtedy dane zapisujesz w pamięci jako tablicę którą możesz sortować, a gdy zostaną osiągnięte pewne kryteria zapisujesz tablicę na dysk jednocześnie czyszcząc tą w pamięci.
Ale i tak uważam że baza będzie bardziej wydajna
koneser69
12.03.2014, 12:20:45
Dane są odbierane z konkretnego urządzenia i zapisywane do pliku o id urządzenia co 5 sekund. Urządzeń jest 100. to działa na soketach. Tzn te 100 urządzeń wysyła dane równocześnie tworzą się osobne procesy z których każdy operuje na innym pliku. I tak to działa. Z tym, że muszę to mieć posortowane w tym pliku.
Postać odbieranej danej
#11111111111,CMD-F,V,DATE:140310,TIME:152556,LAT:67890988899N,LOT:78888776678E,Speed:000.1,0-0-1-0-16-10,000#
a sortowanie w pliku ma być po time.
maly_swd
12.03.2014, 13:26:19
Baza danych do tego będzie najlepsza.
Rozwiąże Ci to masę problemów i będziesz mógł to przeszukiwać, grupować, wyliczać trasę itp.
sazian
12.03.2014, 14:52:30
Zacząłem liczyć i rzeczywiście problem wydaje się być nieco bardziej skomplikowany, ponieważ ten system będzie generował ponad półtora miliona rekordów na dobę

W związku z tym myślę że baza danych będzie jedynym sensownym rozwiązaniem dlatego że:
1)jest łatwiej zarządzać danymi
2)zapisujesz mniej danych na dysku - według moich skromnych obliczeń pliki z jednego miesiąca będą zajmowały 5GB, natomiast baza około 1GB
koneser69
12.03.2014, 18:29:21
Witam
Na studiach uczyli mnie, że do tego typu programów nie należy stosować bazy danych.
Tak to przygotowałem, że dane z każdego dnia są zapisywane w osobnych plikach tzn jest katalog rok/mc/dzień i tutaj są dane z poszczególnych urządzeń. Użytkownik który będzie operował na tych danych będzie maił możliwość wyboru urządzenia oraz konkretnego dnia.
Jak dane będą w bazie dany tzn w jednej tabelce bo nie ma nawet jak tego rozbić aby dokonać jakiejkolwiek optymalizacji. To każde zapytanie wydobywające tzn select będzie musiał przeanalizować wszystkie dane w tej tabelce. W przypadku gdy dane będą trzymane w plikach wystarczy pobrać dane z konkretnego pliku w katalogu dzień I to by było bardzo szybkie gdyby dane były posortowane.
nospor
12.03.2014, 18:37:22
1) Nic nie stoi na przeszkodzie, bys stworzyl tyle tabel ile urządzen. To nie problem.
2) Baza danych całkiem dobrze radzi sobie z dużą ilością rekordów. Wystarczy tylko wlasciwy indeks zalozyc.
ps: to dane urządzenie wysyła dane z roznymi datami? raz 2 godziny wstecz a pozniej 3 godziny wstecz? Dziwne...
koneser69
12.03.2014, 18:41:53
Samo urządzenie działa dobrze. Gdy uda mu się nawiązać połączenie to wysyła aktualne położenie a następnie te które ma w pamięci - i tu pojawia się mój problem z sortowaniem.
nospor
12.03.2014, 18:43:46
No to jedyne co musisz posortowac do dane otrzymane z urządzenia, a nie dane w pliku za kazdym razem. No to do tego przyda sie array_multisort.
koneser69
13.03.2014, 13:35:23
Witam
Postanowiłem przerobić program żeby korzystał z BD. Pojawia się kolejny problem. Skrypt podczas uruchomienia łącz się z BD
$dbhandle = mysql_connect($hostname, $username, $password) or
die("Unable to connect to MySQL");
niestety połączenie po czasie wygasa. Przez co nie można wykonywać kolejnych insertów. Jak sobie poradzić z takim problemem.
YourFrog
13.03.2014, 14:52:03
Hej,
Przy tak dużej ilości danych wydaje mi się że PHP powinien odpaść. Jeżeli jednak zdecydujesz się na PHP to do bazy rzucaj dane które zgrupujesz np po 100 wpisów. Zmień MySQL na Postgres'a to zwiększysz wydajność bazy.
Zigi
13.03.2014, 21:25:43
Cytat(koneser69 @ 13.03.2014, 13:35:23 )

niestety połączenie po czasie wygasa. Przez co nie można wykonywać kolejnych insertów. Jak sobie poradzić z takim problemem.
Możesz napisać po ilu sekundach? Zgaduję: Może powinieneś zebrać wszystkie dane z socketa i dopiero wtedy na końcu skryptu wszystko zapisać.
Możesz zastosować taką konstrukcję żeby jednym zapytaniem zapisać wiele rekordów na raz:
INSERT INTO TABLE ( Column1, Column2 ) VALUES
( Value1, Value2 ), ( Value1, Value2 )
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę
kliknij tutaj.