При работе с совершенно другим сценарием я узнал, что с 29 миллионами строк текста, используя seek() и работая по данным, часто быстрее, чем по очереди. Такая же идея применяется в приведенном ниже скрипте: мы открываем файл и вместо того, чтобы зацикливаться на открытии и закрытии файла (что может привести к увеличению накладных расходов, даже если это не существенно), мы сохраняем файл открытым и возвращаемся к началу.
#!/usr/bin/env python3
from __future__ import print_function
import sys,os
def error_out(string):
sys.stderr.write(string+"\n")
sys.exit(1)
def read_bytewise(fp):
data = fp.read(1024)
print(data.decode(),end="",flush=True)
while data:
data = fp.read(1024)
print(data.decode(),end="",flush=True)
#fp.seek(0,1)
def main():
howmany = int(sys.argv[1]) + 1
if not os.path.isfile(sys.argv[2]):
error_out("Needs a valid file")
fp = open(sys.argv[2],'rb')
for i in range(1,howmany):
#print(i)
fp.seek(0)
read_bytewise(fp)
fp.close()
if __name__ == '__main__': main()
Сам скрипт довольно прост в использовании:
./repeat_text.py <INT> <TEXT.txt>
Для 3-строчного текстового файла и 1000 итераций все идет хорошо, около 0,1 секунды:
$ /usr/bin/time ./repeat_text.py 1000 input.txt > /dev/null
0.10user 0.00system 0:00.23elapsed 45%CPU (0avgtext+0avgdata 9172maxresident)k
0inputs+0outputs (0major+1033minor)pagefaults 0swaps
Сам скрипт не самый элегантный, возможно, он может быть сокращен, но выполняет эту работу. Конечно, я добавил несколько лишних бит здесь и там, например error_out(), что не обязательно - это просто небольшое удобное для пользователя прикосновение.
Да, если вы используете тот же базовый образ для всех трех контейнеров, Вы экономите на диске, так что базовый слой является общим для трех изображений. Это говорит, альпийские разве это не большой, так что если ваш дБ & Апач изображения альпийских основе, это не так плохо, как кажется. Но если вы используете контейнер томов (например для обеспечения статического контента на сервер Apache) можно на базе любого из существующих изображений, и только дисковое пространство будет использоваться будет для Контента, который вы добавляете.
Да, если вы используете одно и то же базовое изображение для всех трех контейнеров, вы сохраняете на диске, так как этот базовый уровень является общим для трех изображений. Это говорит о том, что Alpine не такой большой, поэтому, если ваш DB & amp; Изображения Apache являются альпийскими, это не так плохо, как кажется. Но если вы используете контейнер тома (например, для статического содержимого на сервер Apache), вы можете использовать его на любом из ваших существующих изображений, и единственное место на диске, которое оно будет использовать, будет для добавляемого вами контента.
Да, если вы используете одно и то же базовое изображение для всех трех контейнеров, вы сохраняете на диске, так как этот базовый уровень является общим для трех изображений. Это говорит о том, что Alpine не такой большой, поэтому, если ваш DB & amp; Изображения Apache являются альпийскими, это не так плохо, как кажется. Но если вы используете контейнер тома (например, для статического содержимого на сервер Apache), вы можете использовать его на любом из ваших существующих изображений, и единственное место на диске, которое оно будет использовать, будет для добавляемого вами контента.