#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í ... :)