Linux "больше", как код в Python для очень больших записей кортежа / файла / базы данных / numpy.darray? - PullRequest
0 голосов
/ 29 сентября 2010

Я ищу код буфера для обработки огромных записей в файле tuple / csv / sqlite db records / numpy.darray, буфер может быть похож на команду linux «more».

Запрос пришел от обработки огромных записей данных (возможно, 100000000 строк), записи могут выглядеть так:

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

Я хочу обработать их в numpy.darray. Например, найдите специальные данные, обработайте их и сохраните обратно или обработайте 2 столбца. Тем не менее, он слишком велик, поэтому, если numpy прочитает файл напрямую, это даст мне ошибку памяти.

Тогда, я думаю, что адаптер, такой как страница кэша mem или команда "more file", может сэкономить память при обработке.

Поскольку эти необработанные данные могут быть представлены в другом формате - csv / sqlite_db / hdf5 / xml. Я хочу, чтобы этот адаптер был более нормализованным, поэтому использование «[]» в качестве «строки» может быть более распространенным способом, потому что я думаю, что каждая запись может быть представлена ​​как [].

Так что адаптер, который я хочу, может выглядеть так:

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()

Может кто-нибудь показать мне несколько советов, чтобы не изобретать велосипед?

Кстати, ATpy, http://atpy.sourceforge.net/ - это модуль, который может синхронизировать массив numpy.array с необработанным источником данных в другом формате, однако он также считывает все данные на ходу в память.

И pytable пока что мне не подходит, потому что SQL не поддерживается им, а файл HDF5 может быть не таким популярным, как sqlite db (простите, если это не так).

   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 = []

Спасибо

RGS,

KC

Ответы [ 2 ]

0 голосов
/ 29 сентября 2010

Умммм ... Вы на самом деле говорите не о чем-то большем, чем о списке.

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]

Я не уверен, что вам действительно нужно что-то придумывать.

0 голосов
/ 29 сентября 2010

Модуль linecache может быть полезен - вы можете вызвать getline(filename, lineno) для эффективного извлечения строк из данного файла.

Вам все равно придется выяснить, насколько высоким и широким является экран. Быстрый взгляд позволяет предположить, что существует около 14 различных способов сделать это, некоторые из которых, вероятно, устарели. Модуль curses может быть вашим лучшим выбором, и я думаю, что это будет необходимо, если вы хотите иметь возможность плавно прокручивать назад.

...