Получение индекса следующего элемента в очень большом memmap, который удовлетворяет условию - PullRequest
0 голосов
/ 08 мая 2018

У меня есть memmap в очень большой (10-100 ГБ) файл, содержащий данные о токе и напряжении. Из заданного начального индекса я хочу найти индекс следующей точки, для которой напряжение удовлетворяет заданному условию.

В случае относительно небольшого списка я мог бы сделать это с помощью итератора, например:

filename = '[redacted]'
columntypes = np.dtype([('current', '>f8'), ('voltage', '>f8')])
data = np.memmap(filename, dtype=columntypes)
current = data['current']
voltage = data['voltage']

condition = (i for i,v in enumerate(voltage) if voltage > 0.1)
print next(condition)

но из-за того, что моя карта памяти такая большая, она не может создать итератор. Есть ли способ сделать это питонским способом без фактической загрузки данных в память? Я всегда могу воспользоваться уродливым подходом чтения кусков данных и циклического прохождения по ним, пока не найду нужный мне индекс, но это кажется неэлегатным.

1 Ответ

0 голосов
/ 09 мая 2018

Если файл имеет форматирование в виде разрывов строк (например, пробел / новая строка с разделителем .csv), вы можете читать и обрабатывать построчно:

with open("foo.bar") as f:
    for line in f:
        do_something(line)

Обработка файла кусками не обязательно должна быть безобразной, например:

with open("foo.bar") as f:
    for chunk in iter(lambda: f.read(128), ""):
        do_something(chunk)

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

sizeDataPoint = 128

index = 0

lastIndex = None

with open("foo.bar") as f:
    for chunk in iter(lambda: f.read(sizeDataPoint), ""):
        if(check_conditions(chunk)):
            lastIndex = index
        index += 1

Если это нужно отображать в памяти, я не уверен на 100% в отношении memmap от numpy, но я помню, как использовал библиотеку Python под названием mmap (использовал ее давным-давно) для обработки очень больших файлов. Если я правильно помню, это происходит через процесс ОС, называемый «пейджинг».

Эффективность этой попытки будет зависеть от того, поддерживает ли ваша ОС ее и насколько хорошо она может обрабатывать сборку мусора при переборе файла, но я думаю, что теоретически возможно превышение лимита памяти Python с помощью mmap.

РЕДАКТИРОВАТЬ: Кроме того, mmap большой файл не будет работать, если вы не используете 64-битную ОС, так как он отображает файл в память, используя то же адресное пространство.

...