Назад | Перейти на главную страницу

Почему запись на NAS небольшими порциями выполняется так медленно?

Я только что обнаружил, что узким местом сценария Python является построчная запись небуферизованного текстового файла в наш QNAP NAS. См. Прикрепленный фрагмент кода Python. Это обязательно так медленно или что-то не так с нашей настройкой QNAP / сети?

# local SSD: 2 seconds
with open(r'C:\Daten\numbers.txt', 'w') as f:

# local SSD with buffering: 2 seconds
with open(r'C:\Daten\numbers.txt', 'w', buffering=2**20) as f:

# Share on QNAP NAS: ### 36 ... 61 seconds! ###
with open(r'I:\numbers.txt', 'w') as f:

# Share on QNAP NAS with buffering: 2 ... 3 seconds
with open(r'I:\numbers.txt', 'w', buffering=2**20) as f:
    for i in range(1000000):
        print(i, file=f)

любой небольшой ввод-вывод будет дороже по сравнению с более крупной передачей. В этом случае ситуацию усугубляют:

  • с использованием небуферизованного ввода-вывода
  • отправка данных в сеть, а не по быстрой локальной шине
  • с использованием протокола удаленной файловой системы (например, CIFS или NFS).

Хотя вы можете несколько повысить производительность, настроив поведение сервера NFS / CIFS / SMB, я настоятельно рекомендую вам избегать общего небуферизованного ввода-вывода в пользу буферизованного ввода-вывода + явные точки сброса (если этого требует ваше приложение).