Sdílení proměnných mezi dměma aplikacemi   zodpovězená otázka

C#

Dělám jednu hodně specifickou aplikaci pro zpracovávání obrovského množství dat z burzy NYMEX, ale zaseknul jsem se u sdílení proměnných mezi dvěmi aplikacemi. Jelikož každý instrument má kolem 500M řádků, potřebuji aplikacím zpracovávající data zajistit jejich nejrychlejší přísun. Nejdříve jsem uvažoval o databázi nebo nějaké podobné app. s TCP/IP komunikací, jenže vše je pro můj účel moc pomalé... Jak je možné nejrychleji sdílet gigantické listy v rámci jednoho počítače? Jde mi čistě o jejich čtení, zápis se provede po inicializaci první app. Applikace mezi sebou můžou komunikovat přes http protokol a na začátku si můžou předat ID (adresu) listu, jen data prostě musí jít přímo... Nevím jak to přesně popsat, na internetu jsem nic nenašel - prosím tedy zkušenější fóraře o pomoc. Předem moc děkuji, Michal

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Pokud vám nestačí databáze, napadá mě už jen sdílená paměť, resp. soubor mapovaný do paměti. Jenže pokud obě aplikace tu sdílenou paměť budou měnit, musíte nějak zajistit synchronizaci, což není úplně triviální, a tyhle problémy databáze už řeší.

500M řádků je sice dost, ale databáze takové množství v pohodě zvládají, a na lokálu nekomunikují přes TCP/IP, ale také přes sdílenou paměť.

Máte opravdu otestováno a změřeno, že databáze je pomalá?

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Mně jde o to, abych mohl využívat proměnnou jiné aplikace. Databáze vše řeší dost univerzálně a zbytečně složitě, zde bude jedna datová struktura, která se měnit nebude, případně po x letech. Otestované to mám, testoval jsem rozdíl mezi přístupem do lokální paměti a přístupem do DB, kde obsah byl také v paměti, ale putoval nejspíše přes nějaký handler. Nejde mi o sekundy, ale při kompletní analýze, tedy 500M řádků najednou bylo DB řešení opravdu o dost pomalejší. Můžete mě trošku nasměrovat s tou synchronizací? Stačí směr, ostatní již si najdu sám. Michal

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Data si uložíte nějak binárně do souboru a pak si v obou aplikacích ten soubor namapujete do paměti. Vypadne z toho pole bajtů, ze kterého si to už přečtete.

Jde ale o to, že když soubor z jedné aplikace měníte, musíte zajistit, aby druhá nepřistupovala na stejné místo (ani ho nečetla), jinak můžete načíst nesmysly a bude se to chovat nedeterministicky.

Ta synchronizace se typicky řeší mutexem, ale to je dost pomalé (protože je to meziprocesové), takže záleží, jak často tam zapisujete. Pokud to chcete mít jen read-only, pak na synchronizaci můžete zapomenout a jen ta data přečtete, synchronizovat není třeba a bude to velmi rychlé.

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

A co zkusit napsat server a k němu dva různé klienty?

ZK

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Zbytečně složité.

nahlásit spamnahlásit spam 0 odpovědětodpovědět
                       
Nadpis:
Antispam: Komu se občas házejí perly?
Příspěvek bude publikován pod identitou   anonym.
  • Administrátoři si vyhrazují právo komentáře upravovat či mazat bez udání důvodu.
    Mazány budou zejména komentáře obsahující vulgarity nebo porušující pravidla publikování.
  • Pokud nejste zaregistrováni, Vaše IP adresa bude zveřejněna. Pokud s tímto nesouhlasíte, příspěvek neodesílejte.

přihlásit pomocí externího účtu

přihlásit pomocí jména a hesla

Uživatel:
Heslo:

zapomenuté heslo

 

založit nový uživatelský účet

zaregistrujte se

 
zavřít

Nahlásit spam

Opravdu chcete tento příspěvek nahlásit pro porušování pravidel fóra?

Nahlásit Zrušit

Chyba

zavřít

feedback