SAMBA Shared папка с задачей SETGID

Как указывает John1024, большим подозрением в медлительности является вызов cdrtoip 500 000 раз.

РЕДАКТИРОВАТЬ: на основе предоставленного скрипта cdrtoip вся реализация находится на Python. Это намного быстрее, потому что нет вызова внешнего скрипта.

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

Вот пример реализации на Python. Этот образец читает и записывает в stdin / stdout, как ваш скрипт awk, но его можно легко изменить для открытия файлов. РЕДАКТИРОВАТЬ: лучше очищать и обрабатывать ошибки преобразования. Предоставьте сводку в stderr в конце обработки.

#!/usr/bin/python
import sys,csv

# Convert CISCO format (signed integer) to Hex
# Based on original cdrtoip script in bash
# Note that a ValueError is raised if conversion cannot be done.
def cdrtoip(addrfield):
  intaddr=int(addrfield)    # ValueError if not a valid int

  # Range-check the integer, make it unsigned
  # If out of range, raise a ValueError
  if intaddr < 0: intaddr=intaddr+0x100000000
  if intaddr < 0: raise ValueError
  if intaddr > 0xffffffff : raise ValueError

  return ".".join( [ str(intaddr >> i & 0xff) for i in (24,16,8,0) ] )

# There are other options, depending on the exact file format
# you want. See: https://docs.python.org/2/library/csv.html
indata=csv.reader(sys.stdin)
outdata=csv.writer(sys.stdout)
header=True
no_convert=0
invalid_row=0
row_converted=0
blank_row=0
for row in indata:
   # Write the first line unchanged...
   if header:
      header=False
   else:
      # Note that columns are numbered from 0
      if len(row) == 0:
         blank_row=blank_row+1
         continue
      elif len(row) > 7:
         try:
            row[7]=cdrtoip(row[7])
            row_converted=row_converted+1
         except ValueError:
            # if conversion fails, we count and leave the field unchanged.
            no_convert=no_convert+1
      else:
         # if there is no column 8 we count as invalid row.
         invalid_row=invalid_row+1

   outdata.writerow(row)

# Print a summary of work done (to stderr).
print >> sys.stderr,"%d values converted." % row_converted
if no_convert > 0:
   print >> sys.stderr,"%d values not converted." % no_convert
if invalid_row > 0:
   print >> sys.stderr,"%d rows not valid." % invalid_row
if blank_row > 0:
   print >> sys.stderr,"%d blank rows removed." % blank_row
0
15.12.2017, 07:34
0 ответов

Теги

Похожие вопросы