могут мультипроцессы использования команды “кошки”

X входов в систему раздражающе непоследовательны, о котором используются имена файлов запуска. В системе я использую Вас, должен был бы просто изменить $HOME/.xsessionrc. Но это действительно варьируется. Я обычно помещал свои настройки переменной среды в отдельный файл и источник это от .profile и .xsessionrc.

Если .xsessionrc не работает на Вас, проверяют документацию или читают сценарии в /etc/X11/.

1
04.07.2013, 07:57
3 ответа

Нет никакого эффективного способа параллелизировать добавлять операцию ввода-вывода; каждая строка должна быть записана в свою очередь.

6
27.01.2020, 23:12
  • 1
    Ну, если Вы знаете размеры файла, я предполагаю, что Вы могли в теории создавать большой редкий файл и затем разделять части на блоки в правильные смещения. Однако это все еще будет связанным вводом-выводом, таким образом, он не предлагает преимуществ. –  tripleee 04.07.2013, 08:30

В первую очередь, подтвердите узкое место производительности. Мультипоток бесполезен, если диск io является Вашим узким местом.

Если у Вас есть действительно быстрый диск или SSD, Вы можете статистика длины файлов, вычислить смещения и использовать несколько команд dd.

2
27.01.2020, 23:12

Как насчет сценария как это (со снами, чтобы продемонстрировать, как это параллелизирует операции):

#!/bin/bash

eval exec 3\<<(echo FIRST FILE; sleep 3)
eval exec 4\<<(echo SECOND FILE; sleep 3)

cat <&3
cat <&4

Это параллелизирует чтение входных файлов. Обратите внимание, что это ограничено во многих отношениях и не параллелизирует вывод, но это не может быть сделано так или иначе.

Вот более полный пример, который обрабатывает все файлы в текущем каталоге:

#!/bin/bash

fd=3
for file in *
do
    eval exec $fd\<<(cat $file)

    fd=$((fd + 1))
done

out_fd=3
while [ "$out_fd" -lt "$fd" ]
do
    cat <&${out_fd}
    out_fd=$((out_fd + 1))
done

Стороны выше о производительности являются положительными; существует шанс, которому это не поможет вообще.

Обновление На дальнейшем размышлении, это только выберет с упреждением до размера буфера канала, 64k. Следующая модификация вытянет все файлы в память; если они не могут соответствовать, не используйте его:

#!/bin/bash

fd=3
for file in *
do
    eval exec $fd\<<(content=$(<$file); echo "$content")

    fd=$((fd + 1))
done

out_fd=3
while [ "$out_fd" -lt "$fd" ]
do
    cat <&${out_fd}
    out_fd=$((out_fd + 1))
done
0
27.01.2020, 23:12

Теги

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