Что быстрее удалить первую строку в файле & hellip; sed или хвост?

Вам нужно только установить java JDK и Leiningen

sudo apt-get install openjdk-7-jdk leiningen

Моя настройка такова:

:~ > java -version
java version "1.7.0_65"
OpenJDK Runtime Environment (IcedTea 2.5.3) (7u71-2.5.3-0ubuntu0.14.04.1)
OpenJDK 64-Bit Server VM (build 24.65-b04, mixed mode)

:~ > lein -v
Leiningen 1.7.1 on Java 1.7.0_65 OpenJDK 64-Bit Server VM

Если вы хотите использовать Clojure 1.6, используйте проект .clj, как это

(defproject MyAwesomeProject "1.0.0-SNAPSHOT"
  :description "FIXME: write description"
  :dependencies [[org.clojure/clojure "1.6.0"]])

Cursive пока недоступен, поэтому вам нужно использовать что-то еще. Мой выбор IDE - против часовой стрелки. Он использует Leiningen для управления зависимостями, поэтому вам практически нечего делать.

Если вы хотите обновить зависимостей вручную, cd в каталог проекта и сделать

:~/Clojure/MyAwesomeProject > lein deps
Copying 18 files to /home/francois/Clojure/MyAwesomeProject/lib
, то вы можете легко переключиться.

1
задан 13 April 2017 в 15:25

4 ответа

Вот еще одна альтернатива, используя только встроенные настройки bash и cat:

{ read ; cat > headerless.txt; } < $file

$file перенаправляется в группу команд { }. [F8] просто считывает и отбрасывает первую строку. Остальная часть потока затем передается по каналу cat, который записывает его в файл назначения.

На моем Ubuntu 16.04 производительность этого и tail решения очень схожа. Я создал довольно большой тестовый файл с seq:

$ seq 100000000 > 100M.txt
$ ls -l 100M.txt 
-rw-rw-r-- 1 ubuntu ubuntu 888888898 Dec 20 17:04 100M.txt
$

tail solution:

$ time tail -n +2 100M.txt > headerless.txt

real    0m1.469s
user    0m0.052s
sys 0m0.784s
$ 

cat / brace solution:

$ time { read ; cat > headerless.txt; } < 100M.txt 

real    0m1.877s
user    0m0.000s
sys 0m0.736s
$ 

У меня только сейчас есть Ubuntu VM, и я видел значительные изменения в таймингах обоих, хотя они все в одном и том же шаре.

5
ответ дан 23 May 2018 в 03:10
  • 1
    +1 за ответ спасибо. Это очень интересное решение, и мне нравятся фигурные скобки и справа налево, читаются по порядку иерархии Баша. (не уверен, правильно ли я это сформулировал). Можно ли обновить свой ответ с помощью размера входного файла и результатов теста времени, если это достаточно легко сделать? – WinEunuuchs2Unix 21 December 2016 в 04:50
  • 2
    @ WinEunuuchs2Unix Сроки добавлены, хотя они не очень надежны, так как это на виртуальной машине. Прямо сейчас у меня нет простой установки Ubuntu. – Digital Trauma 21 December 2016 в 05:11
  • 3
    Я не думаю, что VM против Bare Metal имеет значение, когда вы все равно сравниваете VM с VM. Спасибо за временное доказательство. Я бы, вероятно, пошел с tail, но все же думаю, что опция read очень крутая. – WinEunuuchs2Unix 21 December 2016 в 05:34

Попытка в моей системе и префикс каждой команды с помощью time получили следующие результаты:

sed:

real    0m0.129s
user    0m0.012s
sys     0m0.000s

и tail:

[ f2]

, которые показывают, что на моей системе, по крайней мере, AMD FX 8250 с Ubuntu 16.04, хвост значительно быстрее. В тестовом файле было 10 000 строк размером 540 тыс. Файл был прочитан с жесткого диска.

4
ответ дан 23 May 2018 в 03:10
  • 1
    +1 за ответ спасибо. В отдельном тесте в чат-комнате AU один пользователь показал, что хвост в 10 раз быстрее (2,31 секунды), чем sed (21,86 секунды), используя RAMDisk с файлом 61 МБ. Я отредактировал ваш ответ, чтобы применить блоки кода, но вы можете отредактировать его также с размером файла, который вы использовали. – WinEunuuchs2Unix 21 December 2016 в 01:11
  • 2
    @Serg Абсолютно справедливо, что это всего лишь анекдотический ответ, и, возможно, вы получите разные результаты с различными конфигурациями оборудования, различными тестовыми файлами и т. Д. – Nick Sillito 21 December 2016 в 01:47
  • 3
    Файл, не находящийся в кеше, при использовании sed может играть роль в этом результате, это тот порядок, в котором вы их протестировали. – Minix 21 December 2016 в 04:20
  • 4
    какая система? Поскольку я прокомментировал еще одну запись здесь, мой mac sed был примерно в два раза быстрее. – Kevin 22 December 2016 в 00:17

Нет объективного способа сказать, что лучше, потому что sed и tail - это не единственные вещи, которые выполняются в системе во время выполнения программы. Множество факторов, таких как дисковый ввод / вывод, сетевой ввод-вывод, прерывания процессора для процессов с более высоким приоритетом - все это влияет на скорость вашей программы.

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

Есть несколько вещей, которые вы можете иметь в виду, рассматривая, какую команду выбрать:

Какова ваша цель? sed - редактор потоков для преобразования текста. tail предназначен для вывода определенных строк текста. Если вы хотите иметь дело с линиями и распечатывать их, используйте tail. Если вы хотите отредактировать текст, используйте sed. tail имеет гораздо более простой синтаксис, чем sed, поэтому используйте то, что вы можете прочитать сами и что могут прочитать другие.

Другим важным фактором является объем данных, которые вы обрабатываете. Небольшие файлы не дают вам никакой разницы в производительности. Картина становится интересной, когда вы имеете дело с большими файлами. С 2 GB BIGFILE.txt мы видим, что sed имеет гораздо больше системных вызовов, чем tail, и работает значительно медленнее.

bash-4.3$ du -sh BIGFILE.txt 
2.0G    BIGFILE.txt
bash-4.3$ strace -c  sed '1d' ./BIGFILE.txt  > /dev/null
% time     seconds  usecs/call     calls    errors syscall
------ ----------- ----------- --------- --------- ----------------
 59.38    0.079781           0    517051           read
 40.62    0.054570           0    517042           write
  0.00    0.000000           0        10         1 open
  0.00    0.000000           0        11           close
  0.00    0.000000           0        10           fstat
  0.00    0.000000           0        19           mmap
  0.00    0.000000           0        12           mprotect
  0.00    0.000000           0         1           munmap
  0.00    0.000000           0         3           brk
  0.00    0.000000           0         2           rt_sigaction
  0.00    0.000000           0         1           rt_sigprocmask
  0.00    0.000000           0         1         1 ioctl
  0.00    0.000000           0         7         7 access
  0.00    0.000000           0         1           execve
  0.00    0.000000           0         1           getrlimit
  0.00    0.000000           0         2         2 statfs
  0.00    0.000000           0         1           arch_prctl
  0.00    0.000000           0         1           set_tid_address
  0.00    0.000000           0         1           set_robust_list
------ ----------- ----------- --------- --------- ----------------
100.00    0.134351               1034177        11 total
bash-4.3$ strace -c  tail  -n +2 ./BIGFILE.txt  > /dev/null
% time     seconds  usecs/call     calls    errors syscall
------ ----------- ----------- --------- --------- ----------------
 62.30    0.148821           0    517042           write
 37.70    0.090044           0    258525           read
  0.00    0.000000           0         9         3 open
  0.00    0.000000           0         8           close
  0.00    0.000000           0         7           fstat
  0.00    0.000000           0        10           mmap
  0.00    0.000000           0         4           mprotect
  0.00    0.000000           0         1           munmap
  0.00    0.000000           0         3           brk
  0.00    0.000000           0         1         1 ioctl
  0.00    0.000000           0         3         3 access
  0.00    0.000000           0         1           execve
  0.00    0.000000           0         1           arch_prctl
------ ----------- ----------- --------- --------- ----------------
100.00    0.238865                775615         7 total
1
ответ дан 23 May 2018 в 03:10
  • 1
    +1 за ответ спасибо. Но я не уверен, что этот комментарий помогает мне решить, какую команду мне следует использовать .... – WinEunuuchs2Unix 21 December 2016 в 01:13
  • 2
    @ WinEunuuchs2Unix Ну, вы спросили, какая команда лучше, поэтому я отвечаю именно на этот вопрос. Какая команда выбрать, зависит от вас. Если вы можете читать tail лучше, чем sed - используйте это. Я лично использовал бы python или awk, а не sed, потому что он может стать сложным. Кроме того, если вас беспокоит производительность, давайте посмотрим правде в глаза - вы видите результаты в микросекундах здесь. Вы не почувствуете разницы, если это не огромный файл в диапазоне гигабайт, который вы пытаетесь прочитать – Sergiy Kolodyazhnyy 21 December 2016 в 01:16
  • 3
    О, я был бы признателен за ответ awk:) ... Мой вопрос был основан на другом AU Q & amp; A (по ссылке), и там они никогда не упоминали awk. Я согласен, что разница во времени минимальна для небольших файлов. Я просто пытался развить хорошие привычки. – WinEunuuchs2Unix 21 December 2016 в 01:18
  • 4
    @ WinEunuuchs2Unix Конечно, вот оно: awk 'NR!=1' input_file.txt . Это дает мне одинаковый результат, около 150 миллисекунд, то же число для обоих tail и sed. Но agian, я использую SSD, поэтому я бы сказал, что это жесткий диск и процессор, которые имеют значение, а не команда. – Sergiy Kolodyazhnyy 21 December 2016 в 01:22
  • 5
    @Serg даже с файлом размером 60 МБ, содержащим 1M строк, 1000 прогонов с sed занимают более 3 минут, тогда как tail требуется всего 20 секунд. Это не , что большой, но на самом деле, определенно, не в диапазоне GB. – Byte Commander 21 December 2016 в 01:41

Другие ответы показывают, что лучше создать новый файл с отсутствием первой строки. Если вы хотите отредактировать файл, а не создавать новый файл, я уверен, что ed будет быстрее, потому что он не должен создавать новый файл вообще. Но вы должны искать, как удалить строку с ed, потому что я использовал ее только один раз.

0
ответ дан 23 May 2018 в 03:10

Другие вопросы по тегам:

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