Autor Zpráva
Xds
Profil *
Ahoj, chtěl bych se zeptat na vaše zkušenosti s prací s velkými daty. Potřebuji vytvořit aplikaci která bude do databáze ukládat data ze souborů, ktere budou docela velké (stovky MB až jednotky GB) a potom v databázi vyhledávat. Není tu někdo kdo má s podobnými úlohami zkušenost? Určitě bude muset být nastavený větší časový limit a maximální pamět skriptu ale i tak se bojím že to bude trvat dlouho, hlavně nejvíc asi bude zdržovat nahrání souboru do formuláře a odeslání na server.
Zákazník nespecifikoval jestli to má být webová aplikace nebo desktopová a databázový systém také nemám určený, takže to mohu dělat v čem chci. Co byste mi tak doporučili?
Další otázkou je, jak takhle velké soubory ukládat do db?
řekněme že to bude nějaké csv kde každý řádek bude záznam v tabulce v databázi. asi nebude vhodné ukládat každý řádek zvlášť, jak tedy efektivně uložit takový soubor do db?

Děkuji za rady.
mimochodec
Profil
Gigabajtová databáze už je trochu větší, ale nemyslím, že by to byl nějaký problém. Z velikosti strach neměj. Hlavně zvol vhodné datové typy a správně navrhni databázi, tedy pokud půjde o něco jiného, než jednorozměrná data.

Konkrétnější radu můžeš dostat, když dáš o těch datech víc informací.
Alphard
Profil
Vlákno je v PHP, tak budu zatím předpokládat, že bude aplikace napsaná v PHP.

1. Pro řešení uploadu je více možností, od nejjednodušší podoby s prostým uploadem, po různé javascript/flash aplikace, které posílají soubor po částech a dokáží navázat po přerušení.
2. Při kopírování z csv do databáze nebude s pamětí problém, soubor se bude načítat postupně (fgetcsv) a hned ukládat do databáze.
3. Návrh databáze musí odpovídat datům, aby v tom šlo vyhledávat. Nelze to říct obecně, ale pravděpodobně bude jeden řádek (záznam) vstupu cca odpovídat záznamu v databázi.

Ten dotaz desktop/webová aplikace moc nechápu, to ani nevíte, jestli budete budovat webovou aplikace na serveru, nebo aplikaci pro pracovní stanici? Nebo to špatně chápu?
Xds
Profil *
Samozřejmě vím jak to chci dělat, ale nebyl jsem si jistý jestli bude toto možné udělat jako webovou aplikaci kvůli výše popsaným problémům, pokud by to nešlo zvolil bych desktopovou. zákazník má spoustu dat z různých měření a potřebuje v nich vyhledávat a je mu jedno jestli mu to udělám jako webovou nebo desktopovou aplikaci. S návrhem databáze problém nebude,
ale spíš mi dělá starost jak ten soubor vůbec dostanu na server, tj. upload přes formulář. když budu uploadovat gigabajtový soubor, tak mi skript skončí na max_execution_time.
Keeehi
Profil
max_execution_time vůbec neovlivňuje upload souboru. Hlavně proto, že to nedělá php ale webový server. Takže upload souboru proběhne ještě před spuštěním php scriptu. Je to mimo jiné zmíněné i v dokumentaci:
Note: max_execution_time only affects the execution time of the script itself. Any time spent on activity that happens outside the execution of the script such as system calls using system(), the sleep() function, database queries, time taken by the file upload process, etc. is not included when determining the maximum time that the script has been running.

Předpokládám, že zákazník přišel, řekl chci udělat tohle a tamto a je mi jedno, jak to vyřešíte. OK, to vám nechává volné ruce. Je to celkem málo informací, takže těžko něco radit. Jak řešení lokální tak nějaké servrové mají své výhody a nevýhody. U pokud jde o výkon tak bych u lokálního řešení šel do C++. Když to člověk nepodělá (což není zrovna lehké) tak to pak většinou hezky sviští. Máte plnou kontrolu nad pamětí a vždy přesně víte, co děláte.
Na straně serveru moc nevím. PHP je použitelné. Už jsem v něm s většími soubory pracoval a jde to. Jen to asi nebude nejrychlejší řešení. Alé možná to bude good enough řešení. Zrychlení by se mělo dát dosáhnout s HHVM. Ovšem pak je taky spousta jiných jazyků. Z žádným z nich nemám moc zkušeností ale ruby by snad mělo být docela rychlé a taky jsem četl o javascriptu (node.js).
Taky vím, že existuje elasticsearch. Podle informací co mám by to měla být služba která zvládne rychle vyhledávat ve velkých datech. Takže místo do databáze cpete data tam a pak už v nich jen vyhledáváte. O veškerou optimalizaci by se to mělo starat samo. Viděl jsem o tom jednu přednášku, smám jsem nikdy neměl možnost to vyzkoušet ale myslím si, že by stálo za to tuto možnost prozkoumat.
Alphard
Profil
Měl jsem rozepsané něco podobného co Keeehi, teď se omezím na 3 poznámky k uploadu samotnému.
• Máme i jiné protokoly než http, některé z nich se na přenos souborů hodí lépe.
• Rozdělení velkého csv souboru do několika menších je otázka 10 řádků kódu.
• Zkoušel jste to zkomprimovat?
Keeehi
Profil
Když tu Alphard píše o dělení, tak jsem si vzpomněl, že jsem před několika lety napsal třídu, která dokáže rozdělit velký xml soubor na menší. Dneska bych to asi napsal trochu jinak, avšak ta práce se souborem bude pravděpodobně podobná stejná. Minimálně využití funkce fread.

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: