linux „mehr“ wie Code in Python für sehr große Tupel / file / db records / numpy.ndarray?

StackOverflow https://stackoverflow.com/questions/3820503

Frage

Ich bin für einen Puffer-Code für Prozess großer Datensätze in der Suche in Tupel / CSV-Datei / sqlite db records / numpy.darray, der Puffer kann wie Linux-Befehl "mehr".

Die Anfrage kam von Verarbeitung von großen Datensätzen (100000000 Zeilen vielleicht), die Datensätze wie folgt aussehen:

0.12313 0.231312 0.23123 0.152432
0.22569 0.311312 0.54549 0.224654
0.33326 0.654685 0.67968 0.168749
...
0.42315 0.574575 0.68646 0.689596

Ich möchte sie in numpy.darray verarbeiten. Zum Beispiel finden spezielle Daten, die sie verarbeiten und speichern sie zurück, oder 2 cols verarbeiten. Aber es ist zu groß, dann ist, wenn numpy die Datei direkt gelesen wird es mir einen Speicherfehler geben.

Dann, glaube ich, einen Adapter wie mem Cache-Seite oder linux „mehr Datei“ Befehl kann den Speicher, wenn die Verarbeitung speichern.

Da diese Rohdaten präsentiert als anderes Format - csv / sqlite_db / hdf5 / xml. Ich möchte diesen Adapter mehr normalisiert werden, dann verwenden Sie die „[]“ als eine „Reihe“ kann ein gemeinsamer Weg sein, weil ich jede Aufzeichnungen denken kann als [] dargestellt werden.

So Adapter, was ich Mai wie folgt aussieht wollen:

fd = "a opend big file" # or a tuple of objects, whatever, it is an iterable object can access all the raw rows 

page = pager(fd)

page.page_buffer_size = 100    # buffer 100 line or 100 object in tuple

page.seek_to(0)        # move to start
page.seek_to(120)      # move to line #120
page.seek_to(-10)      # seek back to #120

page.next_page()        
page.prev_page()

page1 = page.copy()

page.remove(0)

page.sync()

Kann jemand zeigen mir einige Hinweise, das Rad verhindern neu erfinden?

By the way, ATpy, http://atpy.sourceforge.net/ ist ein Modul kann sync die numpy.array mit roher Datenquelle in anderem Format, jedoch auch all Daten liest in den Speicher in-a-go.

Und die pytable ist für mich bisher nicht geeignet, da SQL ist nicht durch sie und die HDF5 Datei unterstützt möglicherweise nicht so populär wie sqlite db (verzeihen Sie mir, wenn dies falsch ist).

   My plan is write this tools in this way:
    1. helper.py        <-- define all the house-keeping works for different file format
                            |- load_file()
                            |- seek_backword()       
                            |- seek_forward()
                            | ...
    2. adapter.py       <-- define all the interface and import the helper to interact 
                            with raw data and get a way to interact with numpy.darray in somehow.
                            |- load()
                            |- seek_to()
                            |- next_page()
                            |- prev_page()
                            |- sync()
                            |- self.page_buffer_size
                            |- self.abs_index_in_raw_for_this_page = []
                            |- self.index_for_this_page = []
                            |- self.buffered_rows = []

Danke,

Rg,

KC

War es hilfreich?

Lösung

Ummmm .... Sie sind wirklich nicht reden über etwas mehr als eine Liste.

fd = open( "some file", "r" )
data =  fd.readlines()

page_size = 100

data[0:0+page_size] # move to start
data[120:120+page_size] # move to line 120
here= 120
data[here-10:here-10+page_size] # move back 10 from here
here -= 10
data[here:here+page_size]
here += page_size
data[here:here+page_size]

Ich bin nicht sicher, dass Sie tatsächlich etwas erfinden müssen.

Andere Tipps

Die linecache Modul kann hilfreich sein - Sie getline(filename, lineno) effizient abrufen Linien nennen die angegebene Datei.

Sie müssen noch herausfinden, wie hoch und breit ist der Bildschirm. Eine schnelle googlance legt nahe, dass es etwa 14 verschiedene Möglichkeiten, dies zu tun, von denen einige wahrscheinlich veraltet sind. Die Flüche Modul kann die beste Wahl sein, und ich denke, notwendig sein, wenn Sie wollen der Lage sein, nach hinten sanft zu bewegen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top