有没有快速和内存有效的方法来读取大文件的特定行,而无需将其加载到内存?
我编写了一个perl脚本,它运行许多forks,我希望他们从文件中读取特定的行.
目前我正在使用外部命令:
sub getFileLine {
my ( $filePath, $lineWanted ) = @_;
$SIG{PIPE} = '_IGNORE_';
open( my $fh, '-|:utf8', "tail -q -n +$lineWanted \"$filePath\" | head -n 1" );
my $line = <$fh>;
close $fh;
chomp( $line );
return $line;
}
Run Code Online (Sandbox Code Playgroud)
它的速度很快而且很有效 - 但也许有更多的"Perl-ish"方式,就像这个一样快速和内存效率?
如您所知,在Perl中创建fork进程会复制主进程内存 - 因此,如果主进程使用10MB,则fork将使用至少那么多.
我的目标是保持fork进程(所以主要进程直到运行forks)内存使用尽可能低.这就是为什么我不想将整个文件加载到内存中.
是否可以使用Parallel :: ForkManager为fork实现某种超时(时间限制)?
Basic Parallel :: ForkManager脚本如下所示
use Parallel::ForkManager;
my $pm = Parallel::ForkManager->new( 10 );
for ( 1 .. 1000 ) {
$pm->start and next;
# some job for fork
$pm->finish;
}
$pm->wait_all_children();
Run Code Online (Sandbox Code Playgroud)
我想限制时间为"#for work for fork".例如,如果它没有在90秒内完成.那么它(fork)应该被杀死/终止.我想过使用它,但我不得不说,我不知道如何在Parallel :: ForkManager中使用它.
感谢hobbs和ikegami.你的建议都有效.....但只是在这个基本的例子中,而不是在我的实际脚本中:(.
这些叉子将永远存在 - 说实话 - 我不知道为什么.我使用这个脚本几个月.没有改变任何东西(虽然许多事情取决于外部变量).每个fork都必须从网站下载页面,解析它并将结果保存到文件中.每叉不应超过30秒.超时设置为180秒.那些悬挂叉是完全随机的,因此很难追踪问题.这就是为什么我想出一个临时的,简单的解决方案 - 超时和杀死.
什么可能在我的代码中禁用(中断)你的超时方法?alarm()我的代码中没有任何其他地方.
其中一个叉子,悬挂1小时38分钟并返回"超时PID" - 这就是我输入die()的内容alarm().所以超时工作...但它的晚期大约1小时36分钟;).你有什么想法?
我有这个代码:
package Foo;
use Moo;
has attr => ( is => "rw", trigger => 1 );
sub _trigger_attr
{ print "trigger! value:". shift->attr ."\n" }
package main;
use Foo;
my $foo = Foo->new( attr => 1 );
$foo->attr( 2 );
Run Code Online (Sandbox Code Playgroud)
它返回:
$ perl test.pl
trigger! value:1
trigger! value:2
Run Code Online (Sandbox Code Playgroud)
这是Moo中触发器的默认记录行为.
如果通过构造函数设置属性,如何禁用触发器执行?
我当然可以这样做:
package Foo;
use Moo;
has attr => ( is => "rw", trigger => 1 );
has useTriggers => ( is => "rw", default => 0 );
sub _trigger_attr
{ …Run Code Online (Sandbox Code Playgroud) .env当我开发应用程序时,我将配置保存在文件中。
这是我的app.module.ts:
@Module({
imports: [
ConfigModule.forRoot({ isGlobal: true }),
TypeOrmModule.forRoot({
autoLoadEntities: true,
database: process.env.TYPEORM_DATABASE,
host: process.env.TYPEORM_HOST,
password: process.env.TYPEORM_PASSWORD,
port: (process.env.TYPEORM_PORT as unknown) as number,
type: 'postgres',
username: process.env.TYPEORM_USERNAME,
}),
AuthModule,
(...)
],
controllers: [],
providers: [],
})
export class AppModule {}
Run Code Online (Sandbox Code Playgroud)
并typeorm使用变量的正确值process.env.TYPEORM_...。
这是我的auth.module.ts:
@Module({
providers: [JwtStrategy, (...)],
imports: [
JwtModule.register({
secret: process.env.JWT_SECRET,
(...)
}),
(...)
],
controllers: [AuthController],
})
export class AuthModule {}
Run Code Online (Sandbox Code Playgroud)
我从 JwtModule 收到错误,该错误secret不能为空。当然JWT_SECRET是在.env …