gpt4 book ai didi

distributed - 提高 bigint 写入磁盘性能

转载 作者:行者123 更新时间:2023-12-03 18:04:54 25 4
gpt4 key购买 nike

我正在使用非常大的 bigint数字,我需要将它们写入磁盘并稍后再读回来,因为它们一次无法全部放入内存中。

当前的 Chapel 实现首先将 bigintstring然后写下 string到磁盘 [1]。对于大整数来说,这需要很长时间。

var outputFile = open("outputPath", iomode.cwr);
var writer = outputFile.writer();
writer.write(reallyLargeBigint);
writer.close();
outputFile.close();

有没有办法使用GMP的 mpz_out_raw()/ mpz_inp_raw() [2] 或 mpz_export()/ mpz_import() [3] 或其他类似方式转储 bigint的字节直接写入磁盘,无需事先转换为字符串,然后将字节读回 bigint目的?

这也适用于 bigint大批?

如果在当前状态下不可能,如何将这样的功能添加到 Chapel 的标准库中?

[1] https://github.com/chapel-lang/chapel/blob/master/modules/standard/BigInteger.chpl#L346

[2] https://gmplib.org/manual/I_002fO-of-Integers.html

[3] https://gmplib.org/manual/Integer-Import-and-Export.html

最佳答案

您提到的功能在任何 Chapel 模块中均不直接可用,但您可以编写 extern procs and extern types访问 GMP直接发挥作用。

首先,我们需要能够使用 C 文件,因此为它们声明一些过程和类型:

extern type FILE;
extern type FILEptr = c_ptr(FILE);
extern proc fopen(filename: c_string, mode: c_string): FILEptr;
extern proc fclose(fp: FILEptr);

然后我们可以声明我们需要的GMP函数:
extern proc mpz_out_raw(stream: FILEptr, const op: mpz_t): size_t;
extern proc mpz_inp_raw(ref rop: mpz_t, stream: FILEptr): size_t;

现在我们可以用它们写一个 bigint值(value):
use BigInteger;
var res: bigint;
res.fac(100); // Compute 100!

writeln("Writing the number: ", res);

var f = fopen("gmp_outfile", "w");
mpz_out_raw(f, res.mpz);
fclose(f);

并从文件中读回:
var readIt: bigint;

f = fopen("gmp_outfile", "r");
mpz_inp_raw(readIt.mpz, f);
fclose(f);

writeln("Read the number:", readIt);

对于 bigint 的数组values 只是循环它们以写入或读取它们:
// initialize the array
var A: [1..10] bigint;
for i in 1..10 do
A[i].fac(i);

// write the array to a file
f = fopen("gmp_outfile", "w");
for i in 1..10 do
mpz_out_raw(f, A[i].mpz);
fclose(f);

// read the array back in from the file
var B: [1..10] bigint;
f = fopen("gmp_outfile", "r");
for i in 1..10 do
mpz_inp_raw(B[i].mpz, f);
fclose(f);

关于distributed - 提高 bigint 写入磁盘性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47774412/

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