#!/usr/pkg/bin/tclsh
set file [open tblnames r]
set flist [read -nonewline $file]
close $file
set flist [split $flist \n]
foreach f $flist {
set file [open $f r]
set data [read -nonewline $file]
close $file
regsub -all {\000} $data {} data
regsub -all {\n} $data \\\n data
regsub -all {~} $data \n data
set file [open $f w]
puts -nonewline $file $data
close $file
}
проблема в том, что файл достаточно большой (ок. 25гб) и скрипт вылетает с ошибкой, что невозможно выделить память (ну или что-то вроде этого)
Можно ли переписать этот скрипт так, чтобы можно было обрабатывать большие файлы? Bash, python, perl или даже php, это неважно.
Спасибо.
Если файл текстовый то можно попробовать брать по несколько строк их обрабатывать, новую партию в туже переменную. Хотя у меня явные сомнения, что кто-то решится открыть такой большой файл. Попробуйте с различными языками.
regsub -all {\000} $data {} data
regsub -all {\n} $data \\\n data
regsub -all {~} $data \n data
я так и не понял что там на что заменяется.
\000 - это три нулевых байта ? и заменяются на пустую строку?
во второй строке переносы строк заменяются на .... переносы строк с бэкслешем?
третья замена для меня тоже не понятна, что значит {~}?
В таком случае не стоит заморачиваться со скриптами. Их следует использовать только если вы понимаете, что, как и почему они делают, иначе можно напороться на серьёзные проблемы. Особенно если вы пытаетесь эти скрипты переделывать.
Попробуйте другие подходы. Например этот. Или какие-нибудь готовые конвертеры.
В таком случае не стоит заморачиваться со скриптами. Их следует использовать только если вы понимаете, что, как и почему они делают, иначе можно напороться на серьёзные проблемы. Особенно если вы пытаетесь эти скрипты переделывать.
Попробуйте другие подходы. Например этот. Или какие-нибудь готовые конвертеры.
за ссылку спасибо (почему-то она не нагуглилась)
со скриптами тогда заморачиваться не буду.
хотя хотелось бы разобраться, для общего развития.
кстати формат файла: простой текст
sed умеет обрабатывать файлы любой длинны, в т.ч. и двоичные. Главное, что-бы "строки" небыли-бы слишком велики (строкой считается промежуток между '\n'). sed обрабатывает текст построчно, и в памяти находится всего одна строка.
Максимум определяется размером памяти. Когда оно перестанет влезать в ОЗУ и полезет в своп, станет жутко медленно. Когда и в своп перестанет влезать, оно умрёт от нехватки памяти.