gpt4 book ai didi

perl - substr 在非常长的 UTF-8 字符串上的性能问题

转载 作者:行者123 更新时间:2023-12-05 09:22:41 25 4
gpt4 key购买 nike

我在一个很长的 UTF-8 字符串(~250,000,000 个字符)上使用 substr。问题是我的程序几乎卡住在第 200,000,000 个字符附近。

有人知道这个问题吗?我有哪些选择?

当我使用后缀数组索引文档时,我需要:

  1. 让我的绳子保持一体;
  2. 使用索引访问可变长度子字符串。

对于 MWE:

use strict;
use warnings;
use utf8;

my $text = 'あいうえお' x 50000000;

for( my $i = 0 ; $i < length($text) ; $i++ ){
print "\r$i";
my $char = substr($text,$i,1);
}
print "\n";

最佳答案

Perl 有两种字符串存储格式。一种能够存储 8 位字符,一种能够存储 72 位字符(实际上限于 32 位或 64 位)。您的字符串必须使用后一种格式。这种宽字符格式与 UTF-8 一样,每个字符使用可变数量的字节。

找到第一种格式的字符串的第 i 个元素很简单:将偏移量添加到字符串指针。使用第二种格式,找到第 i 个字符需要从头扫描字符串,就像您必须从头扫描文件才能找到第 n 行一样.有一种机制可以在发现字符串时缓存有关该字符串的信息,但它并不完美。

如果每个字符使用固定数量的字节,问题就会消失。

use utf8;

use Encode qw( encode );

my $text = 'あいうえお' x 50000000;

my $packed = encode('UCS-4le', $text);
for my $i (0..length($packed)/4) {
print "\r$i";
my $char = chr(unpack('V', substr($packed, $i*4, 4)));
}

print "\n";

请注意,该字符串将为平假名字符多使用 33% 的内存。也可能不是,因为不再有缓存。

关于perl - substr 在非常长的 UTF-8 字符串上的性能问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25006875/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com