Ошибка копирования: файл слишком большой в Perl - PullRequest
0 голосов
/ 12 июля 2010

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

Я пробовал 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";

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

Ответы [ 5 ]

1 голос
/ 13 июля 2010

В вашем коде обработки ошибок, пожалуйста, измените or die "Copy failed: $!"; на 'или умрите' Сбой копирования: '$ dir1 / $ file' на '$ dir2 / $ file': $! ";

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

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

1) Каждый раз происходит сбой в одном и том же файле?

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

0 голосов
/ 13 июля 2010

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

0 голосов
/ 13 июля 2010

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

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

0 голосов
/ 13 июля 2010

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

0 голосов
/ 12 июля 2010

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

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