Anonymní profil Jerry – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Anonymní profil Jerry – Programujte.comAnonymní profil Jerry – Programujte.com

 

Příspěvky odeslané z IP adresy 2a00:1028:83be:235a:49ff:c521:e1e3:8418...–

Jerry
C / C++ › Binární hledání
8. 9. 2018   #381530

#39 Kevil
aha takže ten 4GB soubor dat co načteš do paměti necháš jak je a prohledáváš ho půlenim intervalu jo ? nebo ho nějak ještě třídíš ? Já že ty položky LAT:-1,320  LON:274,848  , kde LAT násobíš 1000 a přičteš 90000 sou na 3 desetinný místa a LAT je v rozsahu +/-90° a LON je v rozsahu 0..360°... a pak to asi třídíš že ? 

.... přiznám se že nějak nechápu proč to všechno děláš ? tak LAT máš v originále v rozsahu -90,000 do +90,000 a předěláš to na rozsah +000000 do +180000 a LON máš v rozsahu +000,000 do +360,000 a předěláš ho na rozsah +000000 do +360000. ... hele s tim algoritmem se patláš už skoro rok ne ? 

...nechápu proč ty pole třídíš podle LAT nebo LON ... vždyť už ty data máš připravený ke zpracování formou LBA a prohledávání Fibonacciho algoritmem, když trváš na tom tvým "divným" způsobu zpracování. 

já osobně bych to dělal následovně: počet bójí v moři je cca +/- pevný a boje neustále vysílají data a to 4x denně takže záznamy ze souboru BDA_180823.dat bych při načítání do paměti roztřídil tak, že bych si vytvořil K struktur s názvem třeba Buoy_Item, kde každá struktura by odpovídala jedné boji a do této struktury bych nacpal data konkrétní údaje o poloze boje podle času do sekvenčního binárního stromu typu LIST<> a vše toto již při načítání do paměti. Ke struktuře LIST mužeš přistupovat i jako k poli pomocí indexu. Takže struktura by vypadala následovně:

ref class Positon_Item {

     Int32 LON;

     Int32 LAT;

     DateTime^ DateItem;

     constructor Positon_Item(){

           Int32=0;

           Int32=0;

          DateItem=Null;

     } // Positon_Item()

}// Positon_Item

ref class Buoy_Item {

     Int32 BuoyID ;

     List<Position_Item> PositionList^;

     constructor Buoy_Item(Int32 t_buoyID){

           PositionList<Position_Item^> = gcnew Position_Item<Position_Item^>();

           BuoyID=t_buoyID;

     } // Positon_Item()

     destructor Buoy_Item(){

          delete( PositionList ); 

     }// Buoy_Item

}// Buoy_Item

...tim by si měl data načtený do paměti a teď musíš vytvořit pole indexů LBA jako seznam LIST<> aby si mohl rychle najít boje, které jsou v určité oblasti, což uděláš současně při načítání dat do struktur Buoy_Item. Takže položka LBA_Item bude

ref class LBA_Item{

     UInt64 LBAItem;

     Buoy_Item^ buoyItemRef; 

} // LBA_Item   

a pak pochopitelně

LIST<LBA_Item^> LBAList = gcnew LIST<LBA_Item^>();

no a to je všechno. LBAItem bude vyjádřeno jako LBA=360000*LAT+LON, kde LAT je v rozsahu 0..179999 a LON v rozsahu 0..359999 a celkem je tedy k dispozici 180000x360000=64.800.000.000 bloků ve formě řídkého pole neboli řídké matice a protože to je struktura LIST mužeš k ní přistupovat s využitím indexu pole. Současně při načítání pole zatřiďuješ podle velikosti LBA nebo to mužeš setřídit až na konci načítání to je fuk. Nebo pole LBAList mužeš vytvořit rovnou jako k-tree strukturu kde k bude 2, což by bylo asi nejlepší. V tom případě bys se LBA_Item upravila na 

ref class LBA_Item{

     LBA_Item^ parentLink;

     LBA_Item^ leftLink;

     LBA_Item^ rightLink; 

     UInt64 LBAItem;

     Buoy_Item^ buoyItemRef; 

} // LBA_Item   

to by asi bylo nejlepší protože data pole LBAList neustále přibývají, když mám 10000 boji tak mi každej den přibude 40000 záznamů... t.j. 14,6 milionu ročně ... a přitom se předpokládá, že dvě a více bojí mohou mít stejné souřadnice což je pochopitelné 

ty samozřejmě všechno děláš v native C++ takže k-tree si asi uděláš sám .. 

taky by to šlo udělat tak, že si uděláš na disku soubor, jehož velikost je >64GB a každá položka ukazuje na soubor dat, ve kterém budou ID bojí, které bodem prošly :))) takže ten soubor bude mít 320GB a každá položka bude mít 5 bytů (40 bitů), což bude název souboru dat, ve kterém se nachází data boji které prošly daným bodem bomba ne ? :))) takže na serveru bude diskové pole cca 186GB dat (10000 boji x 4 záznamy deně x 356 dni x 100 let x 128 bytů na záznam ) takže jeden disk SSD 1TB ti vystačí v pohodě na 100 let ukládání dat :))) a načítání by probíhalo tak, že nastavíš seek na pevnou pozici v souboru 320GB přečteš bloky dat podle zvoleného obdélníku o rozměrech +/- LAT .. +/- LON a těch bloků dat bude podle LBA víc a pak načteš rovnou data z jednotlivých souborů pozic boji a hned je zobrazíš jako lomenou čáru protože je budeš mít setříděný podle času ...

no je to prostě hezký povídání ... :) 

 

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032022 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý