Сортировка больших файлов дает отказ сегментации

Если Вы ищете что-то легкое, и легкое для установки sshfs является безусловно самым легким настроить. Sshfs монтирует удаленные каталоги через ssh и представляет их как локально смонтированные каталоги и файлы. Это звучит более сложным, чем это на самом деле удается, чтобы быть.

Сначала удостоверьтесь, что у Вас есть sshfs, установленный в системе, где Вы будете желать создать, монтируется. Например, скажите, что у меня есть свой ноутбук и удаленный сервер. Я установил бы sshfs на моем ноутбуке так, чтобы я мог смонтировать каталоги локально на нем от удаленного сервера.

Пример

$ sshfs sam@skinner:/home/sam/docs ~/far_projects

$ ls -l ~/far_projects/
total 1260
drwxr-x--- 1 5060 users   4096 Mar 30  2004 acronyms
drwxr-xr-x 1 5060 users   4096 Nov 16  2008 articles
drwxr-xr-x 1 5060 users   4096 Nov 16  2008 bookmark_repository
drwxr-xr-x 1 5060 users   4096 Oct 14  2009 books
drwxr-xr-x 1 5060 users   4096 Nov 15  2008 cheatsheets
-rw-r--r-- 1 5060 users   6855 Feb 19  2009 cheatsheet.txt

Когда Вы сделаны с монтированием, можно использовать команду fusermount размонтировать его.

$ fusermount -u ~/far_projects
$ ls ~/far_projects/
$ 

В эти типы монтирования можно даже интегрировать /etc/fstab.

4
03.03.2015, 22:54
5 ответов

Сортировке понадобится место на жестком диске для хранения временных данных. /tmp не лучшее место. Команда сортировки хранит рабочие данные во временных дисковых файлах.
Вы можете использовать флаг -T для указания большого временного dir (на разделе с большим количеством свободного места).

1
27.01.2020, 20:49

Я нашел путь на OpenBSD:

http://www.openbsd.org/cgi-bin/man.cgi/openbsd-current/man1/sort.1?query= Сортировка & sec = 1

 -H
    Use a merge sort instead of a radix sort. This option should be used for files larger than 60MB.

Но это не полностью нормальное решение, так как он занимает слишком много места ... x> 100 Гбайт не достаточно для этого ..

0
27.01.2020, 20:49

Другая возможность будет сортировать каждый из файлов отдельно, а затем объединить их:

for f in *txt; do
    sort -u "$f" -T tmp/ > "$f".sorted
done
sort -mu *sorted

Опция -M Сортировать отсортированные файлы вместо попытки отсортировать их. Это должно привести к гораздо более низкому использованию памяти и следует избегать SegFault.

3
27.01.2020, 20:49

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

Решение моей проблемы заключалась в том, чтобы разбить файл с GREP в качестве предварительно процессора. Посмотрите на ваши данные, чтобы увидеть, где будут комки. Я предполагаю, что это прилично распространяется над буквенно-цифровым пространством, но я буду обсуждать, как бороться с комками позже.

for char1 in other {0..9} {a..z}; do
  out="/tmp/sort.$char1"
  echo "Extracting lines starting with '$char1'"
  if [ "$char1" = "other" ]; then char1='[^a-z0-9]'; fi
  grep -i "^$char1" *.txt > "$out"
  sort -u "$out" >> output.txt || break
done

(Это использует басизм. Чтобы избежать его, явное назвать каждый из 37 символов, как для Char1 в другом 0 1 2 3 4 5 6 7 8 9 0 ABCDEF ... )

Clumps: Полностью возможно, что некоторые из этих петлей сортировка вызовы, будут вызовываться из-за иметь слишком много данных. Просто пересматривайте, что итерация, чтобы быть более разбитым на части. Это может быть так же просто, как удаление флага GreeP -I и вызов каждой заглавной буквы (не забудьте изменить другой на [^ a-za-z0- 9] ) или может потребовать копаться в данные. Если это список пакетов программного обеспечения, у вас может быть слишком много строк, начнут с «lib», и поэтому /tmp/sort.l итерация не удастся. || Break Часть этого цикла прекратит обработку в этой точке, чтобы вы могли ее исправить и резюме, где вы остановились. После примера «lib» вы можете возобновить с чем-то вроде этого:

for char1 in 'l[a-h]' 'lia' lib{a..z} lib{0..9} 'li[c-z]' 'l[j-z]' {m..z}; do
  ...

Это разбивает список L в детали до и после части lib *. Это немного уродливо, но это должно работать. Просто обратите внимание на желаемый заказ, чтобы вы могли сохранить его.

3
27.01.2020, 20:49

Объединение разных ответов: Когда вы хотите отсортировать файл на куски, попробуйте использовать Split:

LARGETMP=/var/tmp
mkdir ${LARGETMP}
N_LINES=100000 # Adjust when to still too large or too small
split --lines=${N_LINES} bigfile splitted_
for small in splitted*; do
   sort -u -T ${LARGETMP} ${small} > sorted_${small}
   rm ${small}
done
echo "Done with sorting the splitted files, now concate the stuff"
sort -um -T ${LARGETMP} sorted_* > bigfile.sorted

Редактировать: AS @ UA2B прокомментировал, разделение по размеру в основном будет разделена в середине линий.
(Когда файл не имеет линейных шин, вся идея сортировки немного странно).

2
27.01.2020, 20:49

Теги

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