sql >> Databáze >  >> NoSQL >> MongoDB

Snižte spotřebu paměti při načítání datového rámce obrovských pand z MongoDB

Co je v CSV a co je v datovém rámci, jsou dvě velmi odlišné věci. Například 9.9 a 9.99999999999999 v CSV zabere stejné množství místa v datovém rámci.

To znamená, že data v datovém rámci zabírají mnohem méně místa než data v seznamu. Sestavení seznamu je nákladné na paměť; a připojení k datovému rámci vyžaduje, aby pandy vytvořily nový (větší) datový rámec, vše zkopírovaly a poté ponechaly původní datový rámec, aby se shromáždil odpad.

Pravděpodobně byste udělali mnohem lépe, kdybyste předem alokovali datový rámec 60 000 řádků (nebo kolik řádků máte celkem); např.:

data = pd.DataFrame(np.empty((60000,), dtype=[
    ('x', np.uint8),
    ('y', np.float64)
]))

a poté pro každý řádek vložil data pro tento řádek, aniž by se spoléhal na dataset seznam:

data.values[count,:] = rowdata_at_count

Toto není typově bezpečné, ale je to docela rychlé (protože nedochází k žádným alokacím), takže se ujistěte, že rowdata_at_count je seznam, jehož prvky odpovídají typům sloupců.

UPRAVIT

Ano, připojení 100 řádků je, věřím, jako 100 concats jednoho řádku (protože každé připojení musí přerozdělit a zkopírovat tabulku, stejně jako concat). Předběžná alokace se vyhýbá jak připojování, tak spojování:velikost tabulky se nemění, není třeba provádět žádné přerozdělení a kopírování.



  1. Počítejte vnější i vnitřní embedded pole v jednom dotazu

  2. Součet ve vnořeném dokumentu MongoDB

  3. propojit mongodb s djongem (Django)

  4. NoClassDefFoundError => ClassPath$JavaContext při použití spuštění přehrávání