Модераторы: ginnie, korob2001
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> разрезать файл по-оптимальнее 
:(
    Опции темы
burakov
Дата 9.9.2009, 10:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 554
Регистрация: 28.7.2006

Репутация: нет
Всего: нет



Добрый день

Есть файл большой
его нужно разрезать на части заданного размера (например по 100 Кб)

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

Что в таком способе не устроило - МЕДЛЕННО.
тогда и поставил счетчик на строки и стал проверять размер через определенное количество строк (100 и более) что процесс убыстрило ... но и упала точность разрезки (т.е. части уже получаются не ровно по 100 а как попадет).... и хотя такая точность разрезки файла меня устроила...

Все таки
Вопрос.

А кто как разрезает файл на части?
может есть супер мупер способ и быстрый и точный???
smile



--------------------
Нотный архив http://libnote.ru скачать ноты бесплатно
PM MAIL   Вверх
amg
Дата 9.9.2009, 12:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1145
Регистрация: 3.8.2006
Где: Новосибирск

Репутация: 9
Всего: 50



Цитата(burakov @  9.9.2009,  10:28 Найти цитируемый пост)
А кто как разрезает файл на части?может есть супер мупер способ и быстрый и точный???
Вот (разрезает 167М по 100К за 18 с)
Код
$file = "big_file";
$size = 100*1024;

$inc_length = length sprintf("%d", (-s $file)/$size);

$count = 1;
open F, '<', $file or die "Can't read $file: $!\n";
while (sysread(F,$buffer,$size)) {
  $out = sprintf "%s_%0${inc_length}d", $file, $count++;
  open OUT, '>', $out or die "Can't write to $out: $!\n";
  syswrite(OUT, $buffer);
  close OUT;
}
close F;
Сейчас проверил, системная команда split делает то же самое лишь немного быстрее, за 15 с.

Это сообщение отредактировал(а) amg - 9.9.2009, 12:53
PM MAIL   Вверх
burakov
Дата 10.9.2009, 10:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 554
Регистрация: 28.7.2006

Репутация: нет
Всего: нет



Спасибо.
я думал о таком способе, но он не мне не подошел, т.к.
теряется целостность строки (строки в файле не одинаковы)



--------------------
Нотный архив http://libnote.ru скачать ноты бесплатно
PM MAIL   Вверх
amg
Дата 10.9.2009, 13:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1145
Регистрация: 3.8.2006
Где: Новосибирск

Репутация: 9
Всего: 50



Цитата(burakov @  10.9.2009,  10:45 Найти цитируемый пост)
я думал о таком способе, но он не мне не подошел, т.к.теряется целостность строки (строки в файле не одинаковы)
Ну, если Вас устроит, что размеры файлов будут немного больше заданного числа, то просто дописывайте строку и все. Т.е., после 
syswrite(OUT, $buffer);
добавить
  while (sysread(F,$buffer,1)) {
    syswrite(OUT,$buffer);
    last if $buffer eq "\n";
  }

Скорость работы, думаю, не увеличится слишком сильно.

А если хотите максимально точно (когда размеры файлов будут меньше или больше заданного числа), то существенно сложнее, но тоже можно.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Perl: Системное программирование"
korob2001
sharq
  • В этом разделе обсуждаются вопросы относящиеся только к системному программированию на Perl
  • Если ваш вопрос не относится к системному или CGI программированию, задавайте его в общем разделе
  • Если ваш вопрос относится к CGI программированию, задавайте его здесь
  • Интерпретатор Perl можно скачать здесь ActiveState, O'REILLY, The source for Perl
  • Справочное руководство "Установка perl-модулей", можно скачать здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Perl: Системное программирование | Следующая тема »


 




[ Время генерации скрипта: 0.0423 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.