2015-04-03 1 views
2

Je dois stocker une table sur le disque, et être capable de récupérer un sous-ensemble de cette table dans un numpy.ndarray très rapidement. Quelle est la meilleure façon de faire cela? Cela ne me dérange pas de passer le temps de pré-traiter cet ensemble de données avant de le stocker sur le disque, car il ne sera pas modifié une fois qu'il a été créé.Stocker une grande table sur le disque, avec la récupération rapide d'un sous-ensemble spécifié à np.ndarray

Je préférerais ne pas écrire de code C, et me fier plutôt aux bibliothèques python existantes. Je considère HDF5 (avec pytables ou h5py), sqlite, memmap de numpy, ou un format de fichier binaire personnalisé.

Pour un fichier personnalisé, je trierais les lignes par l'identificateur et ajouterais au fichier une table des matières qui, pour chaque identificateur, spécifierait les décalages de fichier de début et de fin englobant les données liées à cet identificateur. Ce serait probablement très rapide en termes d'E/S, mais au prix d'utiliser python plutôt que le code C (car je ne pense pas qu'il y ait une bibliothèque qui fait exactement cela).

Détails:

environ 100 millions de lignes, ~ 5 colonnes de float et str données. Une des colonnes contient 100 000 identifiants différents (il y a donc environ 1000 lignes par identifiant). Le sous-ensemble à extraire est toujours spécifié par un ensemble d'identifiants (généralement, j'ai besoin de récupérer les identificateurs ~ 2000, donc ~ 2% de l'ensemble de données complet).

Python 3.4, Linux, lecteur SSD (l'accès aléatoire est aussi rapide que séquentiel).

+0

sons comme les lignes dont vous avez besoin seront blocs contigus. Cela fera une grande différence de vitesse, en particulier avec les fichiers HDF5 fragmentés. Quelle est la variation du nombre de lignes par identifiant? – hpaulj

+0

@hpaulj Oui, contiguë tant que je trier puis par identifiant, ce qui bien sûr je le ferai. La variation est probablement comprise entre 500 et 1500 par identifiant. – max

Répondre

0

Vous pouvez créer un jeu de données de référence de région dans lequel chaque élément se rapporte à l'un des identificateurs ~ 2000.

Ensuite, le code Python pour faire référence à un identifiant particulier ressemblerait à ceci: reg_ref - [identifiant] reg_ref_dset mysub = data_dset [reg_ref]