Чтение подмножества больших двоичных файлов эффективно на основе данных в файле - PullRequest
0 голосов
/ 07 февраля 2020

Мне нужно прочитать части большого двоичного файла (в настоящее время ~ 20 ГБ, возможно, в будущем до 30-40 ГБ) в Python. Для файлов меньшего размера (1,5 ГБ) я использовал numpy .fromfile (), чтобы получить все это, а затем поместил в поднабор данные после загрузки файла - это работало нормально. Тем не менее, я полагаю, что при работе с большими файлами моему компьютеру будет сложно, так как он ограничен в памяти. Я думаю, что мне нужно загрузить данные порциями, установить их в подмножество, а затем сохранить, чтобы не пытаться загрузить все 20 ГБ в память, но я нахожу это очень медленным.

Как показано в примере ниже, я пытался просто использовать open () и затем read () для файла и через l oop, захватывая 128 байтов (одну «строку») в время. Затем я делаю проверку условий (если она находится в желаемых временных рамках) и, если да, добавляю ее в массив. Однако я нахожу это очень медленным, поэтому мне интересно, как я мог бы ускорить его. Я всегда стараюсь избегать подобных единовременных операторов if, но я не уверен, как лучше это сделать.

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

dt = np.dtype('f8')
data = np.empty(1)   

f = open(ecoFile,'rb')
while True:
    d = f.read(128)
    if not d:
        break

    dN = np.frombuffer(d,dtype=dt)
    if (dN[0] >= tLims[0]) & (dN[0] <= tLims[1]):
        data = np.append(data,dN)

f.close()
...