У меня есть этот длинный список 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))