【发布时间】:2016-10-16 03:03:29
【问题描述】:
是否可以通过随机采样生成数据集并限制输出的大小?
我有一个 ~260MB 文本文件的输入,我想生成不同大小的文件(~1MB、~5MB、~10MB、...),其中条目是从源文件中随机生成的。
最好的方法是什么?
【问题讨论】:
标签: c# asp.net asp.net-mvc-5 statistics random-sample
是否可以通过随机采样生成数据集并限制输出的大小?
我有一个 ~260MB 文本文件的输入,我想生成不同大小的文件(~1MB、~5MB、~10MB、...),其中条目是从源文件中随机生成的。
最好的方法是什么?
【问题讨论】:
标签: c# asp.net asp.net-mvc-5 statistics random-sample
最简单的方法是读取文件并在输出时跳过行。
您使用模数 (%) 来获取每 n 行。将跳过行设置为示例文件的大小/需要文件的大小。例如 260MB/5MB = 52,因此将 % 运算符设置为 52,您应该会得到一个大约 5mb 的文件。
这是一个简单的例子:
StreamReader inputFile = new StreamReader(File.OpenRead("c:\\bigfile.csv"));
StreamWriter outputFile = new StreamWriter(File.OpenWrite("c:\\smallfile.csv"));
int rowCount = 0;
while(!inputFile.EndOfStream)
{
string line = inputFile.ReadLine();
if (rowCount % 1000 == 1)
outputFile.WriteLine(line);
rowCount++;
}
根据要求使用随机发生器。使用这个版本,计算出 5mb 的行数(我放了 100,000)。然后,这将在文件中随机循环,直到加载 100,000 行。如果它在获取所有行之前完成,它只是开始再次读取文件。这将是“非常”随机的。
StreamReader inputFile = new StreamReader(File.OpenRead("c:\\bigfile.csv"));
StreamWriter outputFile = new StreamWriter(File.OpenWrite("c:\\smallfile.csv"));
Random rand = new Random(Guid.NewGuid().GetHashCode());
int rowCount = 0;
int rowsUsed = 0;
skipCount = rnd.Next(1, 2000);
while(rowsUsed < 100000)
{
while(!inputFile.EndOfStream || rowsUsed > 100000)
{
string line = inputFile.ReadLine();
if (rowCount % skipCount == 1)
{
outputFile.WriteLine(line);
skipCount = rnd.Next(1, 2000);
}
rowCount++;
}
StreamReader inputFile = new StreamReader(File.OpenRead("c:\\bigfile.csv"));
}
【讨论】: