od Eubie » 15. 8. 2006 19:31
Milí spoužáci,
v rámci mého ročníkového projektu se potýkám s menším problém(k)em. Algoritmy, které můj RP používá vyžadují uložení řádově 5000 (délka signatur) x 500 000 (velikost slovníku) floatů, tedy 2.5mld floatů. Float má 32 potažmo 64bitů (a to bohužel i na cílovém serveru, kde to reálně poběží), což dává pěkných 10, resp. 20GB.
Pravděpodobně jediný stroj ÚFALu, který měl 32GB RAM se mi podařilo odpravit a tak zbývají jen ty 10GB stroje. Velikost signatur (první činitel), by bylo dobré moct co nejvíc zvyšovat, ale kvůli malé paměti se to nedá, protože například při délce signatur 8K je už potřeba 4mld floatů a to už je 32GB paměti. Potřeboval bych tedy poradit, jak to pokud možno zkomprimovat, myslím ty floaty v paměti. Ukládat ty floaty na disk je zcela nepřijatelné řešení, neboť pokud by tomu tak bylo, pak by se za běh programu několiksettisíckrát až několikmilionkrát četlo z disku těch několik GB floatů a to by trvalo opravdu dlouho.
A kde že je vlastnost, která podle mě dovoluje komprimaci? Všechny floaty jsou z N(0,1) (což není interval [0,1]...) tedy jsou hodně malý (vztaženo k MAX_FLOAT), dá se ošetřit, že žádný z nich neni větší než třeba 10 (nebo jakákoliv jiná konstanta blízká jedničce - zase blízká vůči MAX_FLOAT). Takže nacpat do jednoho floatu dvě čísla tak, že první vynásobim třeba číslem 10mld a druhý k tomu přičtu, se jeví jako první varianta, ale to je komprimace se ziskem jen 100%. Nemá někdo nějakej nápad, jak by to šlo ještě víc?
Díky
Milí spoužáci,
v rámci mého ročníkového projektu se potýkám s menším problém(k)em. Algoritmy, které můj RP používá vyžadují uložení řádově 5000 (délka signatur) x 500 000 (velikost slovníku) floatů, tedy 2.5mld floatů. Float má 32 potažmo 64bitů (a to bohužel i na cílovém serveru, kde to reálně poběží), což dává pěkných 10, resp. 20GB.
Pravděpodobně jediný stroj ÚFALu, který měl 32GB RAM se mi podařilo odpravit a tak zbývají jen ty 10GB stroje. Velikost signatur (první činitel), by bylo dobré moct co nejvíc zvyšovat, ale kvůli malé paměti se to nedá, protože například při délce signatur 8K je už potřeba 4mld floatů a to už je 32GB paměti. Potřeboval bych tedy poradit, jak to pokud možno zkomprimovat, myslím ty floaty v paměti. Ukládat ty floaty na disk je zcela nepřijatelné řešení, neboť pokud by tomu tak bylo, pak by se za běh programu několiksettisíckrát až několikmilionkrát četlo z disku těch několik GB floatů a to by trvalo opravdu dlouho.
A kde že je vlastnost, která podle mě dovoluje komprimaci? Všechny floaty jsou z N(0,1) (což není interval [0,1]...) tedy jsou hodně malý (vztaženo k MAX_FLOAT), dá se ošetřit, že žádný z nich neni větší než třeba 10 (nebo jakákoliv jiná konstanta blízká jedničce - zase blízká vůči MAX_FLOAT). Takže nacpat do jednoho floatu dvě čísla tak, že první vynásobim třeba číslem 10mld a druhý k tomu přičtu, se jeví jako první varianta, ale to je komprimace se ziskem jen 100%. Nemá někdo nějakej nápad, jak by to šlo ještě víc?
Díky