Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> PHP operacje na Plikach
koneser69
post
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ę.

  1. TIME:154459
  2. TIME:002225
  3. TIME:154458
  4. TIME:002254
  5. TIME:002354
  6. TIME:002324

Chciałbym aby podczas zapisu od razu dane zostały posortowane.
  1. TIME:154459
  2. TIME:154458
  3. TIME:002354
  4. TIME:002324
  5. TIME:002255
  6. TIME:002224

Czy ktoś zna wydajny a zarazem bezpieczny sposób na rozwiązanie mojego problemu?
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 16)
Blackhole
post
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
Go to the top of the page
+Quote Post
YourFrog
post
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
Go to the top of the page
+Quote Post
koneser69
post
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ć.
Go to the top of the page
+Quote Post
Crozin
post
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.
Go to the top of the page
+Quote Post
Wazniak96
post
Post #6





Grupa: Zarejestrowani
Postów: 550
Pomógł: 75
Dołączył: 5.06.2012
Skąd: Lębork

Ostrzeżenie: (0%)
-----


Jeśli odbierasz dane jako jedna zmienna, i każda wartość jedna pod drugą to:
  1. $array = explode(PHP_EOL, $data);
  2.  
  3. rsort($array);
  4.  
  5. $data = implode(PHP_EOL, $data);


Jak nie to sobie przerób smile.gif

PS: Zastanów się rzeczywiście czy nie umieścić danych w bazie...
Go to the top of the page
+Quote Post
sazian
post
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
Go to the top of the page
+Quote Post
koneser69
post
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
Go to the top of the page
+Quote Post
maly_swd
post
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..
Go to the top of the page
+Quote Post
sazian
post
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ę smile.gif
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

Go to the top of the page
+Quote Post
koneser69
post
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.
Go to the top of the page
+Quote Post
nospor
post
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

Go to the top of the page
+Quote Post
koneser69
post
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.
Go to the top of the page
+Quote Post
nospor
post
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

Go to the top of the page
+Quote Post
koneser69
post
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

  1. $dbhandle = mysql_connect($hostname, $username, $password) or die("Unable to connect to MySQL");
  2. $selected = mysql_select_db($db_name, $dbhandle) or die("Could not select examples");


niestety połączenie po czasie wygasa. Przez co nie można wykonywać kolejnych insertów. Jak sobie poradzić z takim problemem.
Go to the top of the page
+Quote Post
YourFrog
post
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
Go to the top of the page
+Quote Post
Zigi
post
Post #17





Grupa: Zarejestrowani
Postów: 57
Pomógł: 3
Dołączył: 20.11.2004

Ostrzeżenie: (0%)
-----


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:
  1. INSERT INTO TABLE ( Column1, Column2 ) VALUES
  2. ( Value1, Value2 ), ( Value1, Value2 )


Ten post edytował Zigi 13.03.2014, 21:26:09
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 21.08.2025 - 04:19