1

我正在尝试生成 40 亿个随机字符实例,范围从 AH 开始,然后将它们全部存储到 Java 中的文本文件中。我尝试了迭代的基线方法,直到计数器达到 4B,但我发现它总是会导致内存问题。

我想知道将字母存储为位而不是将它们的原始值存储为字符是否会更节省内存。如下所示:

A <- 000, B <- 001, C <- 010, D <- 011, E <- 100, F <- 101, G <- 110, H <- 111

如果是这样,我将如何去做?


展望未来,一旦我有一个包含所有这些随机生成的字母的文本文件,打开 txt 文件进行进一步修改的最佳方法是什么?例如替换或附加一些字符。我查看了 Java 的教程并认为随机访问文件可以解决问题,但是有更好的选择吗?

我应该每 n 个字母在字符串中添加一个换行符以允许读取换行符函数停止点吗?

我想简明扼要地说明我的问题,如下:如何有效地将 40 亿个随机有限字母(不是全部 26 个)生成到文本文件中,以便也可以读取和修改以供将来使用?

4

2 回答 2

0

首先,如果要优化存储,请使用bytetype。您无需更改任何内容,因为 byte 可以将字母存储为其原始值。

对原始保存做的最好的事情是生成一个FileOutputStream“页面”,例如每 100 兆字节写入一次。

对于进一步的文件实现,RandomAccessFile可以。我认为添加新行不会有任何好处,因为您已经知道文件中每个“信息单元”的长度,添加新行只会复制存储空间。

希望我能说清楚(并且有意义):)

告诉我进展如何。

于 2012-05-17T01:09:38.823 回答
0

所以你可以在 3 位中保存 8 个不同的值,没错。因此,您可以在一个字节中存储 2x3 位,或者在 24/8=3 字节中存储 8x3 位,而将它们存储为字符仅意味着 24 位中的 3 个字符“A”-“H”。

这节省了 8/3,所以 15 亿字节就可以了。然而,做一个简短的例子假设你必须存储一个不能被 8 整除的序列,那么你的代码中会有一些未使用的字节:

您保存 BA,即 001 000,并且必须将字节填充到 0010:0000。你如何区分它和B?B 只是 001,所以填满了,它也是 0010:0000。

行。对于文件长度为 1.5 GB 的文件,您总是可以附加一个字节,它会告诉您最后一个字节要使用多少位。在上面的示例中,您将一次追加 6,一次追加 3。

但是现在,如果你必须插入一些东西。您始终在二进制序列中移动 3 位,但如果有一个非 8 位禁用插入,您不能只读取以下字节,并将它们附加到您的比特流中,但您必须转置以下每个字节:cut将其分成 2 个和平,将第一部分附加到您的溢出中,并将第二部分保留为下一个字节的溢出。

实现可能不会太棘手 - 但我不知道运行时会如何受到影响。

也许统计分析可以提供帮助。多久添加一次字符,添加多少。多久插入一次什么尺寸?

也许将文件组织成块会更容易 - 可能是 1000 个 2MB 的文件,每个文件都包含一个要附加的空闲缓冲区。最后一个字节可以指定文件中有多少字节被视为内容。

如何指定数据的插入?会是“在位置 2 713 345 947 插入序列“AHA”吗?还是会“插入在“FACHDAG”“BACH”的第三个序列之后?是否存在典型的、经常重复的序列,如自然语言中的单词?

在第一种情况下,外部索引可能非常有用。如果您可以查找,在 1000 个文件中,位置 2,713,345,947 位于哪个文件中,并且平均跳过读取 1.5G 的 50% 的必要性可以大大提高您的速度。

但是您需要进行统计分析:文件会增长还是或多或少保持相同的大小。它的阅读和写作频率。是更新插入、追加、删除。

于 2012-05-17T02:05:01.753 回答