mehr-it/buffer

实现缓冲区工具的库

1.3.0 2020-12-10 08:38 UTC

This package is auto-updated.

Last update: 2024-09-10 16:47:18 UTC


README

这是一个小型库,用于实现简单的缓冲区工具,以处理大数据集。

刷新缓冲区

刷新缓冲区实现了具有指定大小的缓冲区,当缓冲区满时,将自动使用给定的处理函数刷新。

您可以通过以下方式创建实例。它最多接受三个参数

new FlushingBuffer(10, function(data) { /* send data */ });
new FlushingBuffer(10, function(data) { /* send data */ }, function() { return collect(); });

第一个参数指定缓冲区大小,第二个参数是每次缓冲区满时被调用的处理函数。它接收缓冲区数据作为参数。第三个参数是可选的,用作底层数据结构的解析器。如果省略,则使用简单的数组。

使用 add() 方法将新项添加到缓冲区。通常您希望在所有数据都添加后,即使缓冲区不满也最后一次刷新缓冲区。为此,只需调用 flush() 方法手动刷新缓冲区即可

$b = new FlushingBuffer(2, function(data) { /* send data */ });
$b->add(1);
$b->add(2);
$b->add(3);
$b->flush();

如果您想替换缓冲区给定键的元素,也可以指定一个键。

$b = new FlushingBuffer(2, function(data) { /* send data */ });
$b->add(1, 'key1');
$b->add(2, 'key1');

当然,替换现有元素不会增加缓冲区大小,因此不会导致缓冲区刷新。

添加多个项目

要一次性将多个项目添加到缓冲区,可以使用 addMultiple() 方法。默认情况下,键不会被保留。您可以通过将 true 作为第二个参数传递来更改此设置。

$b = new FlushingBuffer(2, function(data) { /* send data */ });
$b->addMultiple([1, 2, 3]);

// with preserved keys

$b->addMultiple(['a' => 1, 'b' => 2, 'c' => 3], true);

填充数组键

要使用相同值填充多个键,可以使用 fillKeys() 方法

$b = new FlushingBuffer(2, function(data) { /* send data */ });
$b->fillKeys(['a', 'b', 'c'], 1);

这将添加/替换键 "a""b""c" 的值为 1

通过路径设置值

setPath() 方法设置给定数组路径的值。路径可以用点表示法指定为字符串,或作为数组

$b = new FlushingBuffer(2, function(data) { /* send data */ });

$b->setPath(['this', 'is', 'a' 'path'], 1);

$b->setPath('this.is.another.path'], 2);

这将根据需要创建新数组级别,但只有根级别项目会影响缓冲区计数。

块处理器

块处理器允许分块处理 iterable 并将处理后的项目作为生成器返回。它们与 PHP 的 array_chunk() 函数类似,但它们可以处理任何类型的 iterable 并返回一个生成器。因此,它们非常适合处理大数据集。

您可以使用它们如下所示

$in = function() { /* input generator code */ };

$generator = (new ChunkProcessor($in, 500, function($chunk) {
	yield /* ... */
}))->consume();

要保留键,可以将 keepKeys 参数设置为 true

$generator = (new ChunkProcessor($in, 500, $processor, null, true))->consume();

作为静态方法存在,它创建处理器并一步调用 consume()

$generator = ChunkProcessor::process($in, 500, $processor);