我正在用 nutch 和 hadoop 做一些测试,我需要大量的数据。我想从 20GB 开始,到 100GB、500GB 并最终达到 1-2TB。
问题是我没有这么多的数据,所以我在想办法产生它。
数据本身可以是任何类型的。一个想法是获取一组初始数据并复制它。但它还不够好,因为需要彼此不同的文件(忽略相同的文件)。
另一个想法是编写一个程序来创建带有虚拟数据的文件。
还有什么想法吗?
对于统计 StackExchange 站点来说,这可能是一个更好的问题(例如,请参阅我关于生成合成数据的最佳实践的问题)。
但是,如果您对数据属性不那么感兴趣,而不是对数据进行操作和使用的基础设施,那么您可以忽略统计站点。特别是,如果您不关注数据的统计方面,而只是想要“大数据”,那么我们可以专注于如何生成一大堆数据。
我可以提供几个答案:
如果您只对随机数字数据感兴趣,请从您最喜欢的 Mersenne Twister 实现中生成一个大流。还有 /dev/random(有关更多信息,请参阅此 Wikipedia 条目)。我更喜欢已知的随机数生成器,因为其他任何人都可以恶心地复制结果。
对于结构化数据,您可以查看将随机数映射到索引并创建一个将索引映射到字符串、数字等的表,例如在生成名称、地址等数据库时可能会遇到的情况。如果您有足够大的表或足够丰富的映射目标,您可以降低冲突的风险(例如相同的名称),尽管您可能希望有一些冲突,因为这些在现实中也会发生。
请记住,使用任何生成方法,您都不需要在开始工作之前存储整个数据集。只要您记录状态(例如 RNG 的状态),您就可以从中断的地方继续。
对于文本数据,您可以查看简单的随机字符串生成器。您可以为不同长度或不同特征的字符串的概率创建自己的估计。句子、段落、文档等也是如此 - 只需决定要模拟哪些属性,创建一个“空白”对象,然后用文本填充它。
如果您只需要避免完全重复,您可以尝试结合您的两个想法——创建一个相对较小的数据集的损坏副本。“损坏”操作可能包括:替换、插入、删除和字符交换。
我会写一个简单的程序来做到这一点。该程序不需要太清楚,因为写入磁盘的速度可能是您的瓶颈。
关于长时间的评论:我最近扩展了一个磁盘分区,我很清楚移动或创建大量文件需要多长时间。向操作系统请求磁盘上的一定范围的可用空间,然后在 FAT 中为该范围创建一个新条目,而不写入任何内容(重用先前存在的信息),会快得多。这将满足您的目的(因为您不关心文件内容)并且与删除文件一样快。
问题是这在 Java 中可能很难实现。我找到了一个名为fat32-lib的开源库,但由于它不使用本机代码,我认为它在这里没有用。对于给定的文件系统,并使用较低级别的语言(如 C),如果您有时间和动力,我认为这是可以实现的。