![]() |
![]() |
![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 45 Pomógł: 0 Dołączył: 18.11.2008 Ostrzeżenie: (0%) ![]() ![]() |
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ę.
Chciałbym aby podczas zapisu od razu dane zostały posortowane.
Czy ktoś zna wydajny a zarazem bezpieczny sposób na rozwiązanie mojego problemu? |
|
|
![]() |
![]()
Post
#2
|
|
![]() Grupa: Zarejestrowani Postów: 283 Pomógł: 1 Dołączył: 15.11.2004 Skąd: Mikołów Ostrzeżenie: (0%) ![]() ![]() |
Jak są te dane odbierane? Przed wysłaniem ich (jakim sposobem) przechowujesz je tymczasowo?
-------------------- Ściskam prawicę...
Jacek http://doscniewoli.pl/ - wszyscy jesteśmy niewolnikami bankierów! http://jezusimarlena.ovh.org/ YouTube - Egzorcyzmy Anneliese Michel |
|
|
![]()
Post
#3
|
|
Grupa: Zarejestrowani Postów: 124 Pomógł: 22 Dołączył: 10.01.2014 Ostrzeżenie: (0%) ![]() ![]() |
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. Ten post edytował YourFrog 11.03.2014, 13:44:34 |
|
|
![]()
Post
#4
|
|
Grupa: Zarejestrowani Postów: 45 Pomógł: 0 Dołączył: 18.11.2008 Ostrzeżenie: (0%) ![]() ![]() |
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ć. |
|
|
![]()
Post
#5
|
|
![]() Grupa: Zarejestrowani Postów: 6 476 Pomógł: 1306 Dołączył: 6.08.2006 Skąd: Kraków Ostrzeżenie: (0%) ![]() ![]() |
Cytat Bazy danych odpadają nie wytrzymią tego. Ciekawi mnie skąd taki wniosek, szczególnie w kontekście tematu dot. zwykłego pliku tekstowego.
|
|
|
![]()
Post
#6
|
|
Grupa: Zarejestrowani Postów: 550 Pomógł: 75 Dołączył: 5.06.2012 Skąd: Lębork Ostrzeżenie: (0%) ![]() ![]() |
|
|
|
![]()
Post
#7
|
|
![]() Grupa: Zarejestrowani Postów: 1 045 Pomógł: 141 Dołączył: 19.09.2006 Skąd: B-tów Ostrzeżenie: (0%) ![]() ![]() |
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 |
|
|
![]()
Post
#8
|
|
Grupa: Zarejestrowani Postów: 45 Pomógł: 0 Dołączył: 18.11.2008 Ostrzeżenie: (0%) ![]() ![]() |
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. Ten post edytował koneser69 12.03.2014, 13:09:03 |
|
|
![]()
Post
#9
|
|
![]() Grupa: Zarejestrowani Postów: 744 Pomógł: 118 Dołączył: 14.02.2009 Skąd: poziome Ostrzeżenie: (0%) ![]() ![]() |
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. -------------------- śmieszne obrazki
Kryzys: Ser jem spleśniały, wino piję stare i samochód mam bez dachu.. |
|
|
![]()
Post
#10
|
|
![]() Grupa: Zarejestrowani Postów: 1 045 Pomógł: 141 Dołączył: 19.09.2006 Skąd: B-tów Ostrzeżenie: (0%) ![]() ![]() |
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 |
|
|
![]()
Post
#11
|
|
Grupa: Zarejestrowani Postów: 45 Pomógł: 0 Dołączył: 18.11.2008 Ostrzeżenie: (0%) ![]() ![]() |
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. |
|
|
![]()
Post
#12
|
|
![]() Grupa: Moderatorzy Postów: 36 557 Pomógł: 6315 Dołączył: 27.12.2004 ![]() |
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... -------------------- "Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista "Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer |
|
|
![]()
Post
#13
|
|
Grupa: Zarejestrowani Postów: 45 Pomógł: 0 Dołączył: 18.11.2008 Ostrzeżenie: (0%) ![]() ![]() |
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.
|
|
|
![]()
Post
#14
|
|
![]() Grupa: Moderatorzy Postów: 36 557 Pomógł: 6315 Dołączył: 27.12.2004 ![]() |
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.
-------------------- "Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista "Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer |
|
|
![]()
Post
#15
|
|
Grupa: Zarejestrowani Postów: 45 Pomógł: 0 Dołączył: 18.11.2008 Ostrzeżenie: (0%) ![]() ![]() |
Witam
Postanowiłem przerobić program żeby korzystał z BD. Pojawia się kolejny problem. Skrypt podczas uruchomienia łącz się z BD niestety połączenie po czasie wygasa. Przez co nie można wykonywać kolejnych insertów. Jak sobie poradzić z takim problemem. |
|
|
![]()
Post
#16
|
|
Grupa: Zarejestrowani Postów: 124 Pomógł: 22 Dołączył: 10.01.2014 Ostrzeżenie: (0%) ![]() ![]() |
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. Ten post edytował YourFrog 13.03.2014, 14:52:28 |
|
|
![]()
Post
#17
|
|
Grupa: Zarejestrowani Postów: 57 Pomógł: 3 Dołączył: 20.11.2004 Ostrzeżenie: (0%) ![]() ![]() |
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:
Ten post edytował Zigi 13.03.2014, 21:26:09 |
|
|
![]() ![]() |
![]() |
Aktualny czas: 21.08.2025 - 04:19 |