小编gib*_*gib的帖子

从Perl中的大文件中读取特定行

有没有快速和内存有效的方法来读取大文件的特定行,而无需将其加载到内存?

我编写了一个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)内存使用尽可能低.这就是为什么我不想将整个文件加载到内存中.

perl file line

8
推荐指数
1
解决办法
1万
查看次数

Perl,Parallel :: ForkManager - 如何实现fork的超时

是否可以使用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()我的代码中没有任何其他地方.

编辑2

其中一个叉子,悬挂1小时38分钟并返回"超时PID" - 这就是我输入die()的内容alarm().所以超时工作...但它的晚期大约1小时36分钟;).你有什么想法?

parallel-processing perl fork timeout

7
推荐指数
1
解决办法
4923
查看次数

如何在构造对象时不执行触发器

我有这个代码:

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)

perl moo

4
推荐指数
2
解决办法
116
查看次数

NestJS 中的环境变量在每个模块中不可见?

.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 …

nestjs

3
推荐指数
1
解决办法
2055
查看次数

标签 统计

perl ×3

file ×1

fork ×1

line ×1

moo ×1

nestjs ×1

parallel-processing ×1

timeout ×1