Ich versuche, eine HDF-Datei von 64 GB (komprimiert mit Blosc) mit der Pandas-Bibliothek zu lesen. Der Dataframe enthält 3 Spalten und 11410996915 Zeilen. Ich versuche, konkrete Zeilen nach Index mit der Methode pandas.read_hdf und dem Argument wo auszuwählen. Das Problem ist, dass manchmal muß ich Tausende von Zeilen erhalten, so in meiner wo Parameter mir etwas so:pandas read_hdf mit großen Bedingungen
simMat = pd.read_hdf('global.h5','matrix', columns=['similarity'], where='index in {}'.format(listIdx))
wo listIdx ist eine Liste von integer, die die Indizes repräsentieren ich zurück bekommen möge. Wenn diese Liste mehr als 31 Elemente enthält, erhalte ich einen Speicherfehler. Ich fing an, in den Code der pandas-Bibliothek zu schauen und entdeckte, dass in der Datei pytables.py in der Klasse BinOp eine Variable namens _max_selectors steht, die den Wert 31 zugewiesen hat. Diese Variable wird danach in diesem Code verwendet:
# if too many values to create the expression, use a filter instead
if self.op in ['==', '!='] and len(values) > self._max_selectors:
filter_op = self.generate_filter_op()
self.filter = (
self.lhs,
filter_op,
pd.Index([v.value for v in values]))
return self
Die Verwendung eines Filters bewirkt, dass die Bibliothek versucht, den gesamten Datenrahmen zu laden, und dadurch entsteht der MemoryError. Ich habe versucht, auch den Chunksize-Parameter mit einem Wert von 10 zu verwenden, und es hat auch nicht funktioniert. Kennen Sie eine bessere Möglichkeit, eine HDF-Datei mit so vielen Indizes abzufragen?