2010-07-12 3 views
0

Хорошо, поэтому у меня есть 6.5 миллионов изображений в папке, и мне нужно, чтобы они были перемещены как можно скорее. Я буду перемещать их в свою структуру папок, но сначала я должен заставить их уйти с этого сервера.«Ошибка копирования: слишком большой файл» в perl

Я пробовал rsync и cp и всевозможные другие инструменты, но они всегда заканчиваются ошибками. Поэтому я написал perl-скрипт, чтобы вытащить информацию более прямым способом. Использование opendir и подсчет всех файлов отлично. Он может подсчитать их всего за 10 секунд. Теперь я пытаюсь просто поднять свой сценарий еще на одну ступень и фактически переместить файлы, и я получаю сообщение об ошибке «Файл слишком большой». Это должно быть какая-то ложная ошибка, так как сами файлы все довольно малы.

#!/usr/bin/perl 
############################################# 
# CopyFilesLite 
# Russell Perkins 
# 7/12/2010 
# 
# Tool is used to copy millions of files 
# while using as little memory as possible. 
############################################# 

use strict; 
use warnings; 
use File::Copy; 

#dir1, dir2 passed from command line 
my $dir1 = shift; 
my $dir2 = shift; 
#Varibles to keep count of things 
my $count = 0; 
my $cnt_FileExsists = 0; 
my $cnt_FileCopied = 0; 

#simple error checking and validation 
die "Usage: $0 directory1 directory2\n" unless defined $dir2; 
die "Not a directory: $dir1\n" unless -d $dir1; 
die "Not a directory: $dir2\n" unless -d $dir2; 

opendir DIR, "$dir1" or die "Could not open $dir1: $!\n"; 
while (my $file = readdir DIR){ 
    if (-e $dir2 .'/' . $file){ 
    #print $file . " exsists in " . $dir2 . "\n"; #debuging 
    $cnt_FileExsists++; 
    }else{ 
    copy($dir1 . '/' . $file,$dir2 . '/' . $file) or die "Copy failed: $!"; 
    $cnt_FileCopied++; 
    #print $file . " does not exsists in " . $dir2 . "\n"; #debuging 
    } 
    $count++; 
} 
closedir DIR; 

#ToDo: Clean up output. 
print "Total files: $count\nFiles not copied: $cnt_FileExsists\nFiles Copied: $cnt_FileCopied\n\n"; 

Значит, кто-нибудь из вас столкнулся с этим раньше? Что может вызвать это и как оно может быть исправлено?

ответ

0

Кажется, это была проблема с моим монтированием nfs сервера, на который он был установлен. Я подключил к нему USB-накопитель, и файлы копируются с предельной скоростью ... если вы считаете usb 2 предельным.

+0

nfs имеет жесткий предел для максимальных файлов, которые могут находиться в каталоге. –

0

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

while (my $file = readdir DIR){ 
    next if -d "$dir1/$file"; 
+0

Он действительно видит. и ... но так как они находятся в обоих местах, они пропускают их. Он копирует только файлы, находящиеся в каталоге dir1, но не dir2 –

+1

Вы все еще получаете копию с моим кодом? – toolic

1

На ваш код обработки ошибок, могли бы вы изменить or die "Copy failed: $!"; к «или умереть«Копировать не удалось: „$ dir1/$ файл“ в «$ dir2/$ file ': $! ";' ?

Затем он должен сообщить вам, где произошла ошибка.

Затем проверьте 2 вещи -

1) Есть ли терпеть неудачу каждый раз на тот же файл?

2) Этот файл как-то особенный? Странное имя? Необычный размер? Не обычный файл? Не файл вообще (как объяснил другой ответ)?

0

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

Я знаю, что вы сейчас преследуете решение в Perl, но, имея дело с этим количеством файлов из оболочки, вы захотите воспользоваться командой xargs. Это может помочь, объединив файлы в управляемые куски. http://en.wikipedia.org/wiki/Xargs

0

Возможно, файловая система раздела вы отправляете данные, чтобы не поддерживать очень большие данные.