ADODB – paměťová náročnost
Při řešení úlohy filtrující záznamy ve více sloupcích s více kriterii jsem
narazil na omezení ( neefektivnost ) automatického filtru ( musel bych ho použít
vícekrát ) a složitost zápisu podmínek u rozšířeného filtru - podmínky typu
AND a OR u jednoho sloupce s kombinaci stejných podmínek v dalších sloupců se
podmínky rošířeného filtru dostaly do obludných rozměrů
Rozhodl jsem se pro použití SQL dotazů a tím pádem pro ADODB referenci. Jelikož jsem si byl vědom, že dotaz může být prováděn až 100x ( výpočtu typu kolikrát kdo s kým v tabulce o 30 tis. záznamech členěných do dalších rozpadů ). Zároveň sem měl zkušenost, že s počtem opakujicích se dotazů stoupá velikost paměti, kterou Excel zabíra v paměti. To se mi potvrdilo i v tomto připadě, kdy se z počatečních 35 MB RAM, Excel vyšplhal až někde k 600 MB a poté zhavaroval. V předchozích úlohách, jsem se proto vždy rozhodl pro jiné řešení, ale tentokrát sem začal pátrat po přičině problému.
Po poradě s Radkem Jurečkem jsem optimalizoval SQL dotaz ( nepoužival jsem SELECT * FROM, ale specifikoval jsem sloupce, zkoušel jsem různý přístup při vykonávaní doatzu – adLockOptimistic, adLockPessimistic apod ), ale paměťové nároky se nezmenšily.
Pátral jsem dál a na stránkách podpory společnosti Microsoft jsem nalezl článek, kde Microsoft přiznává toto chování a označuje ho za chybu ( Microsoft has confirmed that this is a bug in the Microsoft products that are listed at the beginning of this article. ). Microsoft také nabízí dvě řešení.
1, přenést datat do nového sešitu pomocí SELECT INTO
2, volat SQL z jiného sešitu a odkazovat se na zavřený sešit.
Použil jsem druhý způsob a pomocí metody SaveAs, jsem aktivní sešit uložil do adresáře Temp Windows a uložil jsem kompletní cestu k tomuto sešitu. Veškeré dotazy jsem pak prováděl na tomto zavřeném sešitu. Problém s paměti byl tímto krokem vyřešen.
Odkazy:
Popis řešení na stránkách podpory Microsoftu
Příklady použití sešitu Excelu jako externí zdroj dat