Есть ли способ получить метки времени из большого файла pcap быстрее с помощью следующего кода? - PullRequest
0 голосов
/ 09 мая 2019

У меня есть этот длинный список 97M байтов (daList), который содержит лидарные пакеты данных.Я пытаюсь получить только временные метки от каждого из этих пакетов.Временные метки расположены в конце пакетов, а нижний колонтитул, который я пытаюсь найти, начинается с 4-х байтов временной метки.

Я попробовал свой код с небольшим примером из списка длиной 21 Кбайт, и он работает как яв розыске.Когда я попытался использовать фактические данные, я в итоге оценил, что это займет 33 часа ...

Вот что я делаю:

with open(sampleFile, 'r') as h:
    daList = h.read().split(',')

Я получаю байты в список (возможно,Я должен использовать другой тип данных?) Из файла.Затем:

findThis = '37,22,ff,ff,ff'
findThis = findThis.split(',')
idx = find_sublist(findThis, daList)
timeStampList = []
idxSum = idx
while idx > 0:
    print(idx)
    start = time.time()
    t4 = daList[idxSum-5]
    t3 = daList[idxSum-4]
    t2 = daList[idxSum-3]
    t1 = daList[idxSum-2]
    myTime = '0x' + t1 + t2 + t3 + t4
    timeStampList.append(myTime)
    idx = find_sublist(findThis,daList[idxSum:])
    idxSum = idxSum + idx
    end = time.time()
    print(end-start)

и функция find_sublist - это то, что я нашел в stackoverflow из другого вопроса:

def find_sublist(sub, bigger):
    if not bigger:
        return -1
    if not sub:
        return 0
    first, rest = sub[0], sub[1:]
    pos = 0
    try:
        while True:
            pos = bigger.index(first, pos) + 1
            if not rest or bigger[pos:pos+len(rest)] == rest:
                return (pos)
    except ValueError:
        return -1

Так что здесь каждый цикл while занимает около 1,5 секунд.обычно он находит индекс нижнего колонтитула в 1248-й (это длина пакета данных) позиции каждого цикла, но есть и некоторые другие пакеты (которые не имеют длину 1248 байт и не содержат меток времени: бесполезные пакеты),Итак, из этого я понимаю, что это займет 97M / 1248 * 1,5 секунды ...

Итак, не могли бы вы помочь мне получить желаемый результат (с заполнением timeStampList) быстрее, пожалуйста?Несколько связанных вопросов:

Будет ли лучше, если я попытаюсь избавиться от пакетов длиной не 1248 байт в предыдущей функции обработки строк?Так что у меня есть все пакеты с 1248 байтами длинных пакетов и я пытаюсь получить метки времени другим способом, чем этот?Таким образом, я бы теперь разместил позицию каждого байта timestap в «daList».

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

Знаете ли вы, проще ли обрабатывать эти лидарные пакеты с помощью драйвера ROS velodyne?Я только начал работать с лидаром (Velodyne VLP-16) и хотел получить временные метки для тестирования чего-либо, и мне было проще написать скрипт, чем копаться в файлах драйверов и т. Д.

Спасибо!

Также я бы сказал, что я начинающий программист, и я открыт для всех ваших предложений / отзывов о всем коде, которым я делюсь ниже:

#!/usr/bin/env python3

import time

def find_sublist(sub, bigger):
    '''returns the starting order(starting from 1, not 0, to avoid conflict with "sub" being found at the first element of "bigger") of the sublist inside the bigger list. returns -1 if could not find'''
    if not bigger:
        return -1
    if not sub:
        return 0
    first, rest = sub[0], sub[1:]
    pos = 0
    try:
        while True:
            pos = bigger.index(first, pos) + 1
            if not rest or bigger[pos:pos+len(rest)] == rest:
                return (pos)
    except ValueError:
        return -1

startt = time.time()
sampleFile = 'out_samp.txt'
with open(sampleFile,'w') as g:
    with open('/home/can/Documents/lidar_data/outside_test_bytes','r') as f:
        for line in f:
            try:
                lineList = line.split('   ')
                del lineList[-1]
                lineList = lineList[0].split()
                del lineList[0]
            except IndexError as error:
                print (error)
            if lineList:
                for each in lineList:
                    g.write(each)
                    g.write(',')

with open(sampleFile, 'r') as h:
    daList = h.read().split(',')

print(len(daList))
findThis = '37,22,ff,ff,ff'
findThis = findThis.split(',')
idx = find_sublist(findThis, daList)
timeStampList = []
idxSum = idx
while idx > 0:
    print(idx)
    start = time.time()
    t4 = daList[idxSum-5]
    t3 = daList[idxSum-4]
    t2 = daList[idxSum-3]
    t1 = daList[idxSum-2]
    myTime = '0x' + t1 + t2 + t3 + t4
    timeStampList.append(myTime)
    idx = find_sublist(findThis,daList[idxSum:])
    idxSum = idxSum + idx
    end = time.time()
    print(end-start)
tl1 = daList[-4]
tl2 = daList[-5]
tl3 = daList[-6]
tl4 = daList[-7]
myTime = '0x' + tl1 + tl2 + tl3 +tl4
timeStampList.append(myTime)

for i,ts in enumerate(timeStampList):
    timeStampList[i] = int(ts,16)

print (timeStampList)
endd = time.time()
print ('elapsed time: {}'.format(endd-startt))

...