【问题标题】:Random Sampling limit by file size文件大小的随机采样限制
【发布时间】:2016-10-16 03:03:29
【问题描述】:

是否可以通过随机采样生成数据集并限制输出的大小?

我有一个 ~260MB 文本文件的输入,我想生成不同大小的文件(~1MB、~5MB、~10MB、...),其中条目是从源文件中随机生成的。

最好的方法是什么?

【问题讨论】:

    标签: c# asp.net asp.net-mvc-5 statistics random-sample


    【解决方案1】:

    最简单的方法是读取文件并在输出时跳过行。

    您使用模数 (%) 来获取每 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"));
            }
    

    【讨论】:

    • 所以每次都会生成相同的 5MB 文件。正确的?我需要 5MB 的文件,这些文件可能会有所不同,但每次都不一样。我最初的实现是选择一个随机项目并跳过 n 个项目。但是我无法确定输出的文件大小。如何为生成的每个文件生成不同的内容?或者有没有办法在写入之前预先确定/估计文件大小?
    猜你喜欢
    • 2018-06-11
    • 1970-01-01
    • 1970-01-01
    • 2015-02-13
    • 2021-08-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多