Вместо того, чтобы читать сразу все 46000000 значений в ядре, ваше описание данных в cnai_all.csd
, поскольку в нем много строк, предполагает, что каждая строка может обрабатываться независимо. Если это так, используйте
while (<$fh>) {
my @words = split /\s/, $_;
insert_row \@words;
}
где insert_row
- это подпрограмма, которую вы определите, чтобы вставить эту строку в вашу базу данных.
Обратите внимание, что split /\s/
часто является ошибкой. Документация perlfunc для split
объясняет:
В особом случае указание ШАБЛОНА пробела (' '
) будет разбито на пустое пространство, как split
без аргументов. Таким образом, split(' ')
может использоваться для эмуляции поведения по умолчанию в awk, тогда как split(/ /)
даст вам столько нулевых начальных полей, сколько имеется начальных пробелов. split
на /\s+/
походит на split(' ')
за исключением того, что любой начальный пробел создает нулевое первое поле. split
без аргументов действительно split(' ', $_)
внутренне.
В штатном случае все нормально:
DB<1> x split /\s/, "foo bar baz"
0 'foo'
1 'bar'
2 'baz'
Но что, если между полями есть несколько пробелов? Означает ли это пустое поле или просто «широкий» разделитель?
DB<2> x split /\s/, "foo bar baz"
0 'foo'
1 ''
2 'bar'
3 'baz'
А как насчет пробелов?
DB<3> x split /\s/, " foo bar baz"
0 ''
1 'foo'
2 'bar'
3 'baz'
Поведение по умолчанию split
не является произвольным. Пусть инструмент работает на вас!
while (<$fh>) {
insert_row [ split ];
}