生成大量字母以供将来操作的最佳方式

时间:2012-05-17 01:01:53

标签: java memory text random bit

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

我想知道将字母存储为位而不是将其原始值存储为字符是否会更高效。如下:

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

如果是这样,我该如何做呢?


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

我应该每隔n个字母在字符串中添加换行符,以使读取换行符功能成为停止点吗?

我想简明扼要地陈述我的问题,它是以下内容: 如何有效地为文本文件生成4亿个随机有限字母(不是全部26个),以便它们也可以被读取和修改以备将来使用?

2 个答案:

答案 0 :(得分:0)

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

原始保存的最佳方法是生成FileOutputStream和“页面”,例如每100兆字节写一次。

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

希望我能说清楚(并且有道理):)

告诉我它是怎么回事。

答案 1 :(得分:0)

所以你可以在3位中保存8个不同的值,这是对的。因此,您可以在一个字节中存储2x3位,或者在24/8 = 3个字节中存储8x3位,而将它们存储为字符只能表示3个字符&#39; A&#39; - &#39; H&#39;在24位。

这可以节省8/3,所以可以节省15亿个字节。但是,举一个简短的例子假设您必须存储一个不能被8分割的序列,那么您的代码中会有一些未使用的字节:

您保存BA,即001 000,并且必须将字节填入0010:0000。你怎么区别于B? B只是001,所以填满,也是0010:0000。

确定。对于文件长度为1.5 GB的文件,您可以随时附加单个字节,该字节告诉您要使用的最后一个字节的位数。在上面的示例中,您将添加6,一次追加3.

但现在,如果你必须插入一些东西。您总是通过二进制序列移位3位,但如果存在非8-disible插入,则您不能只读取以下字节,并将它们附加到您的比特流,但您必须转换每个后续字节:将它切成2个和平,将第一个部分附加到你的超限,并将第二个部分保持为下一个字节的溢出。

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

也许统计分析可以提供帮助。附加字符的频率,以及多少。多久插一次?

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

如何指定数据插入?它是&#34;插入位置2 713 345 947序列&#34; AHA&#34;?或者它将是&#34;在#34; FACHDAG&#34;的第三个序列之后插入&#34; BACH&#34 ;?是否存在典型的,经常重复的序列,如自然语言中的单词?

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

但您需要进行统计分析:文件是否会增长或者或多或少保持相同的大小。它多久被读写一次。是否更新插入,追加,删除。