我有一个应用程序,它将大量的文本数据读入标量,有时甚至是GB.我substr在该标量上使用将大部分数据读入另一个标量并用空字符串替换提取的数据,因为在第一个标量中不再需要它.我最近发现的是,Perl并没有释放第一个标量的内存,而是认识到它的逻辑长度发生了变化.所以我需要做的是将数据从第一个标量再次提取到第三个undef标量,第一个标量并将提取的数据放回原位.只有这样,第一个标量所占用的内存才能真正释放出来.将undef分配给该标量或小于分配的内存块的其他值不会改变有关分配的内存的任何信息.
以下是我现在所做的事情:
$$extFileBufferRef = substr($$contentRef, $offset, $length, '');
$length = length($$contentRef);
my $content = substr($$contentRef, 0, $length);
$$contentRef = undef( $$contentRef) || $content;
Run Code Online (Sandbox Code Playgroud)
$$contentRef在第一行中可能是例如5 GB的大小,我提取了4 GB的数据并替换了提取的数据.第二行现在将报告例如100 MB的数据作为字符串的长度,但是例如Devel::Size::total_size仍将输出为该标量分配的5 GB数据.并且分配undef或者这样$$contentRef似乎没有改变这一点,我需要undef在该标量上调用函数.
我本以为应用$$contentRef之后已经至少部分释放了后面的内存substr.似乎并非如此......
那么,如果变量超出范围,是否只释放内存?如果是这样,为什么在同一个标量上分配undef不同的调用undef作为函数?
我正在开发一个将数据存储在 PostgreSQL 数据库中的新应用程序。其他数据类型是来自某些测量设备的仪表记录。每个客户可能有成百上千的这些设备,并且通常每天提供的记录很少。新记录通过简单地删除旧记录来替换旧记录,并作为具有新 ID 的新记录插入。我的公司不知道我们每天真正需要存储多少拥有多少测量设备和记录的客户。
由于这是一个新应用程序,我想请教您关于使用serialvs.bigserial作为仪表记录 ID 的建议。当前的 x64 CPU 等是否有任何明显的性能降级?ID 字段的存储应该增加 2 倍,对吗?为什么不使用任何明显的原因bigserial?
谢谢!
这个问题与Perl 关于内存处理的前一个问题的答案有关.我已经了解到可以通过undef在可用标量上显式使用该函数来释放Perl中的内存,并且使用Devel::Peek或者Devel::Size可以看到为标量分配了多少内存.在所有这些情况下,调试的标量都在其范围内使用.
但是有可能在变量范围之外调试分配内存之类的东西,只是在Perl解释器的层面上吗?有点像为当前解释器中的标量搜索所有"事物"的所有已分配内存并打印其相关数据,如当前值等?
如果是这样的话,如果一个人已经有了这些信息,那么是否能够释放已知的记忆?就像调用undef一个标量,但没有标量,更低级别的东西,就像那些"东西"的输出一样Devel::Peek.
我正在考虑的是在请求之后执行mod_perl清理处理程序,扫描当前mod_perl解释器以获取大块数据并手动释放它们.仅仅因为我认为大块分配的数据不再有用,即使Perl认为不是这样:
最后,也许最大的胜利是内存重用:当调用Perl子程序时,内存分配是在第一次使用它们时为变量做出的.后续使用变量可能会分配更多内存,例如,如果标量变量需要保存比之前更长的字符串,或者数组中添加了新元素.作为优化,Perl会挂起这些分配,即使它们的值"超出范围".
https://perl.apache.org/docs/2.0/user/intro/overview.html#Threads_Support
我可以找到很多关于低级内存访问的监视和调试包,但是没有提示如何undef在Perl中调用某些低级Perl结构上的函数.如果没有任何XS或类似的话,可能根本不可能......
我经常使用File :: Map将特别小的文本文件映射到内存中,例如在那些上处理一些只读的正则表达式.现在我有一个用例,我需要在文件中替换一些文本并认为我仍然可以使用File::Map,因为它记录了以下内容:
文件被映射到一个可以像任何其他变量一样被读取的变量,并且可以使用标准的Perl技术(例如regexps和substr)来编写它.
虽然我有兴趣替换的数据在文件中被正确替换,但我丢失了数据,因为文件保持原始大小,最后数据被截断.新数据比旧数据略大.使用以下句子记录两件事情:
不建议直接写入内存映射文件
将新值截断为内存映射的大小
对两个警告的解释都不应该写任何东西File::Map,但它可能适用于一个人可以使用截断文件或整个文件大小根本没有改变的情况.但是第一个引用明确提到写入是支持的,没有任何例外.
那么,是否有一些特殊的方法可以安全地使用File::Map,例如增加底层文件等等?第一个警告使用了措辞directly,我觉得还有一些其他更好的支持写作方式?
我只是=~ s///在目前的映射视图上使用,这似乎是错误的方法.我甚至找不到任何人试图写File::Map任何东西,只有正式的测试完全按照我的方式进行,并期待我得到的警告.另外,看一下代码,似乎只有一个用例,其中写入根本不会产生警告,但我不明白我是如何触发的:
static int mmap_write(pTHX_ SV* var, MAGIC* magic) {
struct mmap_info* info = (struct mmap_info*) magic->mg_ptr;
if (!SvOK(var))
mmap_fixup(aTHX_ var, info, NULL, 0);
else if (!SvPOK(var)) {
STRLEN len;
const char* string = SvPV(var, len);
mmap_fixup(aTHX_ var, info, string, len);
}
else if (SvPVX(var) != info->fake_address)
mmap_fixup(aTHX_ var, info, SvPVX(var), SvCUR(var));
else
SvPOK_only_UTF8(var);
return 0;
} …Run Code Online (Sandbox Code Playgroud) 在我的一个项目中,我对一个JRE中的一个文件具有并发写入权限,并希望通过首先写入临时文件并使用原子移动将该临时文件移动到目标来处理该文件.我不关心写访问的顺序等等,我需要保证的是单个文件可用的任何给定时间.我已经知道Files.move等等,我的问题是我看了一下该方法的至少一个实现,并且它引发了一些疑问,即实现是否真的能保证原子移动.请看下面的代码:
Files.move在GrepCode for OpenJDK上
1342 FileSystemProvider provider = provider(source);
1343 if (provider(target) == provider) {
1344 // same provider
1345 provider.move(source, target, options);
1346 } else {
1347 // different providers
1348 CopyMoveHelper.moveToForeignTarget(source, target, options);
1349 }
Run Code Online (Sandbox Code Playgroud)
问题是在所有情况下都不考虑选项ATOMIC_MOVE,但源和目标路径的位置是唯一重要的事情.这不是我想要的以及我对文档的理解:
如果移动无法作为原子文件系统操作执行,则抛出AtomicMoveNotSupportedException.例如,当目标位置位于不同的FileStore上并且需要复制文件,或者目标位置与该对象的不同提供者相关联时,可能会出现这种情况.
上面的代码明显违反了该文档,因为它根本不依赖于复制删除策略而根本不识别ATOMIC_MOVE.在我的情况下,一个例外是完全可以的,因为我们服务的主机可以改变他的设置只使用一个支持原子移动的文件系统,因为这是我们对系统要求的期望.我不想处理的是静默失败的事情,因为实现使用了复制删除策略,这可能导致目标文件中的数据损坏.因此,根据我的理解,依赖Files.move进行原子操作是不安全的,因为如果不支持这些操作,它并不总是会失败,但实现可能会回归到复制删除策略.
这种行为是否是实施中的错误,需要提交或文档是否允许这样的行为,我理解错了?如果我现在已经知道那些可能已经破坏的实现在那里使用了,它会有什么不同吗?在这种情况下,我需要自己同步写访问权限...
我有一个访问PostgreSQL数据库的应用程序,需要根据一些需要的处理从中读取一些大的二进制数据.这可能是数百MB甚至数GB的数据.请不要讨论使用文件系统等等,它就像现在这样.
该数据只是各种类型的文件,例如它可能是Zip容器或其他类型的存档.一些需要的处理是列出Zip的内容,甚至可以提取一些成员进行进一步处理,也可以散列存储的数据......最后,数据被多次读取,但只写入一次以存储它.
我使用的所有Perl库都可以使用文件句柄,有些用于IO::Handle,有些用于IO::String或者IO::Scalar,其他一些只有低级文件句柄.所以我所做的就是创建的子类IO::Handle和IO::Seekable它就像周边的相应方法的包装DBD::Pg.在CTOR中,我创建了一个与数据库的连接,打开一些提供的LOID用于读取并存储Postgres在实例中提供的句柄.然后我自己的句柄对象被转发给能够使用这种文件句柄的人,并且可以直接在Postgres提供的blob中读取和搜索.
问题是使用低级文件句柄或低级文件句柄操作的库IO::Handle.Digest::MD5似乎是Archive::Zip另一个.Digest::MD5 croak并且告诉我没有提供句柄,Archive::Zip另一方面尝试从我的创建一个新的,自己的句柄,IO::Handle::fdopen在我的情况下调用和失败.
sub fdopen {
@_ == 3 or croak 'usage: $io->fdopen(FD, MODE)';
my ($io, $fd, $mode) = @_;
local(*GLOB);
if (ref($fd) && "".$fd =~ /GLOB\(/o) {
# It's a glob reference; Alias it as we cannot get name of anon GLOBs
my $n = qualify(*GLOB);
*GLOB = *{*$fd};
$fd = $n;
} …Run Code Online (Sandbox Code Playgroud) GitHub 支持Subversion客户端的文档,我在许多项目中使用它来将它们包含在我的一个工作副本中svn:externals.从昨天开始,我收到所有这些项目的以下错误:
'[...]'处的服务器不支持HTTP/DAV协议.
这发生在一长串项目中,例如:
https://github.com/apache/commons-lang.git/tags/LANG_3_6
https://github.com/pgjdbc/pgjdbc.git/tags/REL42.2.2
https://github.com/ams-tschoening/kaitai_struct_tests.git/branches/libs_java_3rd_usage
Run Code Online (Sandbox Code Playgroud)
我已经写过支持但尚未收到任何回复.也许这里有人知道这是暂时的问题还是永久性的?也许这个问题根本没有出现在其他用户身上?
谢谢!
一些用 Java 实现的守护进程在 Windows 7 上运行,将文件从一个目录复制到另一个目录,而源目录和目标目录都是 Windows Server 2016 托管的网络共享。复制是使用 Apache Commons IO 完成的,偶尔会发生此过程失败的情况具有以下堆栈跟踪和一条类似于“没有更多文件”的消息:
java.io.IOException: Es sind keine weiteren Dateien vorhanden
at java.io.WinNTFileSystem.canonicalize0(Native Method)
at java.io.WinNTFileSystem.canonicalize(Unknown Source)
at java.io.File.getCanonicalPath(Unknown Source)
at org.apache.commons.io.FileUtils.copyFile(FileUtils.java:642)
at org.apache.commons.io.FileUtils.copyFileToDirectory(FileUtils.java:587)
at org.apache.commons.io.FileUtils.copyFileToDirectory(FileUtils.java:558)
at de.am_soft.osgi.dokliste.eingaenge.impl.internal.Eingang.copyFilesToDbxmlFolders(Eingang.java:283)
Run Code Online (Sandbox Code Playgroud)
Apache Commons IO 在第 642 行使用以下代码,该行实际上只是以下内容if,而不是例外:
if (srcFile.getCanonicalPath().equals(destFile.getCanonicalPath())) {
throw new IOException("Source '" + srcFile + "' and destination '" + destFile + "' are the same");
}
Run Code Online (Sandbox Code Playgroud)
所以问题不在于复制本身,而在于已经生成规范路径。在运行守护程序的客户端上使用 Process Monitor 1也证明了这一点。以下是守护进程明确记录上述异常之前的最后一个事件,尝试使用 Logback 等发送错误邮件。该事件 ( ) 的结果NO …
我碰到一个处理文件名的问题的javax.mail,而且有些方面需要通过会话属性,并通过一些系统属性进行配置。许多类javax.mail似乎将它们处理的属性存储在静态字段中,如下例所示MimeBodyPart:
private static final boolean encodeFileName =
PropUtil.getBooleanSystemProperty("mail.mime.encodefilename", false);
Run Code Online (Sandbox Code Playgroud)
根据我的理解,这将系统属性的具体值绑定到某个具体类加载器中的类的生命周期。谁先加载那个类,是唯一能够影响值的人。这正是发生在我身上的事情:
我知道我需要设置一些特定的系统属性来影响文件名处理,并在我处理文件名的地方这样做,为了文档目的等,为了使事情尽可能地靠近。但出于某种原因,以前的代码加载了类更早的兴趣,将错误的值绑定到静态字段。改变这一点的唯一方法是将我的值设置到调用层次结构中较早的位置,但我花了一些时间才注意到静态字段的事情。
这对我来说似乎是一个糟糕的策略,因为我无法轻易知道与我共享同一个类加载器的代码使用了我所做的相同类。理论上,这将迫使我在已经启动 JVM 时设置我的系统属性,使我的代码的实现细节成为各种不同情况下的管理细节。如果完全使用系统属性而不是 session-once,我会期望它们像 session-once 一样被实时查询。否则在某些情况和用例下更改相应设置是不必要的困难。
OTOH,当前的方法可能只是有一些我不知道的好处,比如查询系统属性非常昂贵。
那么,做MimeBodyPart上述事情的充分理由是什么?
我有一个Web应用程序,目前只支持PostgreSQL作为后端,并拥有自己的用户管理.使用Postgres身份验证机制使用通用用户帐户完成与数据库的连接.此应用程序现在应该只为基于触发器和存储过程的某些已创建和已更改的数据获取审计日志,并且出于性能原因,如果所有内容都与Web应用程序异步并且独立,则会很好.
有一个主要问题:我们想知道Web应用程序的哪个用户进行了一些更改或创建了数据,但是这些信息通常在存储过程中不可用,因为我们使用通用帐户连接到Postgres.我想避免做的是调用Web应用程序中的存储过程并以这种方式提供用户ID,因为这意味着在Web应用程序中的可能位置添加相关调用.除此之外,我们使用没有Web应用程序的数据库直接更新数据模型,这意味着我们在任何情况下都需要触发器.
目前,Web应用程序正在处理在每个请求上启动的事务并在其结束时提交.因此,我在每个请求中在事务中创建一个临时表,它始终获取请求的当前用户ID,该请求应该可用于由创建或更改的数据上的触发器执行的存储过程.
我不知道的一些事情是,执行的存储过程是否甚至可以访问数据库的当前事务,因此能够从临时表中检索当前用户ID?该表不是为其创建触发器的已更改数据的一部分.如果每个请求创建一个临时表以在最坏的情况下只存储一个Integer,性能将如何受到影响?如果触发器能够访问临时表,则请求可以随时完成,因为它的工作已完成或有错误.这将如何影响一个触发器,该触发器将访问临时表,该临时表仅在存储过程想要读取用户ID的情况下在提交或恢复的事务中退出?
有没有其他方法可以将用户ID映射到触发器可以访问的事务的某个唯一标识符?除了一个临时表,我可以创建一个普通的表,在每个请求的开始,我将用户id映射到事务id,但独立于当前事务.如果触发器现在将获得负责执行触发器的事务id,则存储过程可以使用事务id来查找使用该事务的用户id.
有什么想法吗?谢谢!
我添加了一个关于触发器生命周期和执行上下文的问题,这个问题符合这个问题:
我们有一个应用程序,它将大型二进制数据存储为PostgreSQL数据库中的大型对象,现在有一个用例,我们对这些数据进行操作,以便我们知道这些已保存数据的部分只会稍微保存一次不同的组合.我们实际上将拆分一些文件并以不同的方式组合它们,但是希望将原始文件另外保存到新的组合文件中.
这听起来像是一个考虑重复数据删除的好用例.你是否知道Postgres中任何直接和透明的东西,这样我们就不需要重新发明轮子了?像Postgres一样添加存储层或插件,以便它至少为整个数据库处理它自己的重复数据删除?或者也许一些库作为Postgres的大对象函数的包装器,我们的应用程序可以使用它和包装器lib完成所有复制部分,可能会添加一些表用于簿记和所有这些东西?
我们知道支持重复数据删除的文件系统,一种可能是将它们用作Postgres数据存储的后端.另一种选择是将新数据保存在Postgres之外的重复数据删除文件系统中.但是现在我们更喜欢Postgres中的一些东西,它可以很容易地被抛弃并且由交易等支持.
谢谢你的任何提示!
我有一个包含某些类型列的表smallint,并且想要提供一个CASTfromvarchar到smallint来仅为该列实现一些转换。因此,为了能够CAST根据我的需求创建特定的列,我需要该特殊列的类型。已经尝试使用域,但 Postgres 警告那些在 a 中被忽略的内容CAST,所以看起来我被困住了CREATE TYPE,但我不想自己实现所需的 input/output_function ,因为最后我只需要 Postgres 中已经可用的任何内容smallint。
问题是我不知道这些函数的名称,它们存储在哪个库中,是否需要提供可能因不同操作系统上的安装而异的路径,或者这些路径是否可用。
CREATE TYPE那么,是否有可能smallint完全只使用 Postgres 函数并且以独立于平台/路径的方式进行操作呢?
我没有发现有人做类似的事情。谢谢!
我有以下三个作业,其中第二个看起来不标准:
my $realRef = [1, 2, 3];
my @nonRef = [4, 5, 6];
my $nonRef = [7, 8, 9];
Run Code Online (Sandbox Code Playgroud)
第二个实际上应该是以下内容:
my @nonRef = (4, 5, 6);
Run Code Online (Sandbox Code Playgroud)
打印时,所有三个变量都包含数组引用,尤其是同名变量,只是不同之处@,$不会共享相同的数据或相互覆盖。
Ref: ARRAY(0x1fd6a8); $VAR1 = [
1,
2,
3
];
Ref: ARRAY(0x6445d8); $VAR1 = [
4,
5,
6
];
Ref: ARRAY(0x644740); $VAR1 = [
7,
8,
9
];
Run Code Online (Sandbox Code Playgroud)
为什么完全@nonRef包含数组引用?那是存储在$nonRef符号表条目中nonRef还是类似的东西?为什么值@nonRef和$nonRef不重叠?两者不都是只参照不同的插槽,相同的符号表项ARRAY主场迎战SCALAR?因为最后两个存储引用,我本来希望使用与插槽相同的符号表条目SCALAR。
谢谢!
perl ×5
postgresql ×5
java ×4
memory ×2
sql ×2
sqldatatypes ×2
arrays ×1
atomic ×1
audit ×1
database ×1
duplicates ×1
filehandle ×1
filesystems ×1
github ×1
jakarta-mail ×1
mod-perl ×1
perl-io ×1
reference ×1
svn ×1
tortoisesvn ×1
triggers ×1
windows ×1