- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我编写了一个 perl 程序,可以将记录从 csv 解析到数据库中。
该程序运行良好,但需要很长时间。所以我决定 fork 主要的解析过程。
在与 fork 进行了一些争论之后,它现在运行良好并且运行速度提高了大约 4 倍。主要的解析方法是相当数据库密集型的。为了方便起见,对于解析的每条记录,都有以下数据库调用:
1 - 检查唯一生成的 base62 与 baseid 映射表是否唯一2 - 有一个存档检查以查看记录是否已更改3 - 记录被插入数据库
问题是,当解析器以 fork 模式运行时,我开始收到“Mysql has gone away”错误,所以经过多次摆弄后,我想出了以下 mysql 配置:
#
# * Fine Tuning
#
key_buffer = 10000M
max_allowed_packet = 10000M
thread_stack = 192K
thread_cache_size = 8
myisam-recover = BACKUP
max_connections = 10000
table_cache = 64
thread_concurrency = 32
wait_timeout = 15
tmp_table_size = 1024M
query_cache_limit = 2M
#query_cache_size = 100M
query_cache_size = 0
query_cache_type = 0
当解析器运行时,这似乎有固定的问题但是,当下一个模块在主解析器之后运行时,我现在得到一个“Mysql 服务器已经消失”。
奇怪的是,导致问题的模块涉及对当前只有 3 条记录的表进行非常简单的 SELECT 查询。直接作为测试运行(不在解析器之后)它工作正常。
我尝试在解析器模块运行后添加 4 分钟的暂停 - 但我得到了同样的错误。
我有一个主要的 DBConnection.pm 模型: 包DBConnection;
use DBI;
use PXConfig;
sub new {
my $class = shift;
## MYSQL Connection
my $config = new PXConfig();
my $host = $config->val('database', 'host');
my $database = $config->val('database', 'db');
my $user = $config->val('database', 'user');
my $pw = $config->val('database', 'password');
my $dsn = "DBI:mysql:database=$database;host=$host;";
my $connect2 = DBI->connect( $dsn, $user, $pw, );
$connect2->{mysql_auto_reconnect} = 1;
$connect2->{RaiseError} = 1;
$connect2->{PrintError} = 1;
$connect2->{ShowErrorStatement} = 1;
$connect2->{InactiveDestroy} = 1;
my $self = {
connect => $connect2,
};
bless $self, $class;
return $self;
}
然后所有模块,包括 fork 的解析器模块,使用以下命令打开到数据库的连接:
package Example;
use DBConnection;
sub new {
my $class = shift;
my $db = new DBConnection;
my $connect2 = $db->connect();
my $self = {
connect2 => $connect2,
};
bless $self, $class;
return $self;
}
问题是如果我有 Module1.pm 调用 Module2.pm 调用 Module3.pm 并且它们每个都实例化与数据库的连接,如上所示(即在构造函数中)那么它们是否使用不同的数据库连接还是相同的连接?
我想知道脚本是否需要 6 个小时才能完成,如果对数据库连接的顶级调用超时了较低级别的数据库连接,即使较低级别的模块正在建立其“自己的”连接。
试图找到问题是非常令人沮丧的,因为我只能在运行很长的解析过程后才能重现错误。
很抱歉问了这么长的问题,在此先感谢任何能给我任何想法的人。
这是实际的 fork 部分:
my $fh = Tie::Handle::CSV->new( "$file", header => 1 );
while ( my $part = <$fh> ) {
if ( $children == $max_threads ) {
$pid = wait();
$children--;
}
if ( defined( $pid = fork ) ) {
if ($pid) {
$children++;
} else {
$cfptu = new ThreadedUnit();
$cfptu->parseThreadedUnit($part, $group_id, $feed_id);
}
}
}
然后是 ThreadedUnit:
package ThreadedUnit;
use CollisionChecker;
use ArchiveController;
use Filters;
use Try::Tiny;
use MysqlLogger;
sub new {
my $class = shift;
my $db = new DBConnection;
my $connect2 = $db->connect();
my $self = {
connect2 => $connect2,
};
bless $self, $class;
return $self;
}
sub parseThreadedUnit {
my ( $self, $part, $group_id, $feed_id ) = @_;
my $connect2 = $self->{connect2};
## Parsing stuff
## DB Update in try -> catch
exit();
}
据我了解, fork 后将调用数据库连接。
但是,正如我上面提到的,上面概述的 fork 代码工作正常。它是下一个不工作的模块,它是从 Controller 模块运行的, Controller 模块一次只运行一个工作模块(解析器是其中之一)—— Controller 模块不会在其构造中或任何地方创建数据库连接否则。
我忘了说,如果我只解析少量文件而不是整个队列,我不会在解析器之后的“问题”模块中收到任何错误。
因此,几乎就好像密集的 fork 解析和访问数据库使得正常的非 fork 进程在它结束一段不确定的时间后就无法使用它。
当解析器在 Mysql 状态下运行完成时,我唯一注意到的是 Threads_connected 大约为 500,并且在一段时间内不会减少。
最佳答案
这取决于您的程序的结构,问题中并不清楚。
如果您在fork
之前创建数据库连接,Perl 将为每个进程制作数据库连接对象的副本。如果两个进程尝试使用同一个数据库连接同时访问数据库,这可能会导致问题。
另一方面,如果您在fork
ing 之后创建数据库连接,每个模块都会有自己的连接。这应该可行,但如果模块 x 创建连接,然后等待很长时间以等待模块 y 中的进程完成,然后尝试使用连接,则可能会出现超时问题。
总而言之,这是您想要的:
fork
时没有任何打开的连接。子进程应创建自己的连接。关于mysql - Perl 模块实例化 + DBI + fork "Mysql server has gone away",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15966168/
我最近在我的机器上安装了 cx_Oracle 模块,以便连接到远程 Oracle 数据库服务器。 (我身边没有 Oracle 客户端)。 Python:版本 2.7 x86 Oracle:版本 11.
我想从 python timeit 模块检查打印以下内容需要多少时间,如何打印, import timeit x = [x for x in range(10000)] timeit.timeit("
我盯着 vs 代码编辑器上的 java 脚本编码,当我尝试将外部模块包含到我的项目中时,代码编辑器提出了这样的建议 -->(文件是 CommonJS 模块;它可能会转换为 ES6 模块。 )..有什么
我有一个 Node 应用程序,我想在标准 ES6 模块格式中使用(即 "type": "module" in the package.json ,并始终使用 import 和 export)而不转译为
我正在学习将 BlueprintJS 合并到我的 React 网络应用程序中,并且在加载某些 CSS 模块时遇到了很多麻烦。 我已经安装了 npm install @blueprintjs/core和
我需要重构一堆具有这样的调用的文件 define(['module1','module2','module3' etc...], function(a, b, c etc...) { //bun
我是 Angular 的新手,正在学习各种教程(Codecademy、thinkster.io 等),并且已经看到了声明应用程序容器的两种方法。首先: var app = angular.module
我正在尝试将 OUnit 与 OCaml 一起使用。 单元代码源码(unit.ml)如下: open OUnit let empty_list = [] let list_a = [1;2;3] le
我在 Angular 1.x 应用程序中使用 webpack 和 ES6 模块。在我设置的 webpack.config 中: resolve: { alias: { 'angular':
internal/modules/cjs/loader.js:750 return process.dlopen(module, path.toNamespacedPath(filename));
在本教程中,您将借助示例了解 JavaScript 中的模块。 随着我们的程序变得越来越大,它可能包含许多行代码。您可以使用模块根据功能将代码分隔在单独的文件中,而不是将所有内容都放在一个文件
我想知道是否可以将此代码更改为仅调用 MyModule.RED 而不是 MyModule.COLORS.RED。我尝试将 mod 设置为变量来存储颜色,但似乎不起作用。难道是我方法不对? (funct
我有以下代码。它是一个 JavaScript 模块。 (function() { // Object var Cahootsy; Cahootsy = { hello:
关闭。这个问题是 opinion-based 。它目前不接受答案。 想要改进这个问题?更新问题,以便 editing this post 可以用事实和引文来回答它。 关闭 2 年前。 Improve
从用户的角度来看,一个模块能够通过 require 加载并返回一个 table,模块导出的接口都被定义在此 table 中(此 table 被作为一个 namespace)。所有的标准库都是模块。标
Ruby的模块非常类似类,除了: 模块不可以有实体 模块不可以有子类 模块由module...end定义. 实际上...模块的'模块类'是'类的类'这个类的父类.搞懂了吗?不懂?让我们继续看
我有一个脚本,它从 CLI 获取 3 个输入变量并将其分别插入到 3 个变量: GetOptions("old_path=s" => \$old_path, "var=s" =
我有一个简单的 python 包,其目录结构如下: wibble | |-----foo | |----ping.py | |-----bar | |----pong.py 简单的
这种语法会非常有用——这不起作用有什么原因吗?谢谢! module Foo = { let bar: string = "bar" }; let bar = Foo.bar; /* works *
我想运行一个命令: - name: install pip shell: "python {"changed": true, "cmd": "python <(curl https://boot
我是一名优秀的程序员,十分优秀!