随机分配非常大的文本文件的行

卑鄙的

我想将一个文件中的行随机化,该文件包含超过3200万行的10位数字字符串。我知道该怎么做,File.ReadAllLines(...).OrderBy(s => random.Next()).ToArray()但是这并不能提高内存效率,因为它将所有内容加载到内存中(超过1.4GB),并且仅适用于x64体系结构。

替代方法是将其拆分并随机化较短的文件,然后将其合并,但是我想知道是否有更好的方法来做到这一点。

鲍德里克

此应用程序使用字节数组演示所需的内容

  1. 它创建一个文件,其填充数字为0到32000000。
  2. 它将加载文件,然后使用块复制Fisher-Yates方法将它们混洗到内存中。
  3. 最后,它以随机顺序写回文件

峰值内存使用量约为400 MB。在我的机器上运行大约20秒(主要是文件IO)。

public class Program
{
    private static Random random = new Random();

    public static void Main(string[] args)
    {
        // create massive file
        var random = new Random();
        const int lineCount = 32000000;

        var file = File.CreateText("BigFile.txt");

        for (var i = 0; i < lineCount ; i++)
        {
            file.WriteLine("{0}",i.ToString("D10"));
        }

        file.Close();

        int sizeOfRecord = 12;

        var loadedLines = File.ReadAllBytes("BigFile.txt");

        ShuffleByteArray(loadedLines, lineCount, sizeOfRecord);

        File.WriteAllBytes("BigFile2.txt", loadedLines);
    }

    private static void ShuffleByteArray(byte[] byteArray, int lineCount, int sizeOfRecord)
    {
        var temp = new byte[sizeOfRecord];

        for (int i = lineCount - 1; i > 0; i--)
        {
            int j = random.Next(0, i + 1);
            // copy i to temp
            Buffer.BlockCopy(byteArray, sizeOfRecord * i, temp, 0, sizeOfRecord);
            // copy j to i
            Buffer.BlockCopy(byteArray, sizeOfRecord * j, byteArray, sizeOfRecord * i, sizeOfRecord);
            // copy temp to j
            Buffer.BlockCopy(temp, 0, byteArray, sizeOfRecord * j, sizeOfRecord);
        }
    }
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何处理非常大的文本文件?

在Java中读取非常大的文本文件

使用Python解析非常大的文本文件?

有效地删除一个非常大的文本文件的最后两行

在HDFS中将多个文本文件串联为一个非常大的文件

C#从SQL查询建立非常大的文本文件

按最大行分割非常大的文本文件

在PowerShell中对非常大的文本文件进行排序

编辑非常大的SQL转储/文本文件(在Linux上)

在C ++中有效读取非常大的文本文件

在C#中读取和写入非常大的文本文件

读取非常大的一个班轮文本文件

如何在非常大的文本文件(〜150 GB)中找到最大的数字?

使用Powershell从非常大的文本文件中获得子字符串

在python中批处理非常大的文本文件

我需要拆分一个非常大的文本文件

如何通过VBA优化从excel中非常大的文本文件中提取数据的性能

读取大文本文件非常慢

无论如何,我可以加快将非常大的文本文件数据添加到AutoComplete ComboBox的速度吗?

如何在Powershell中以预定义的字符串拆分非常大的文本文件(4GB),并快速完成

在go中读取文本文件中的随机行

从文本文件中获取随机行

从文本文件中获取随机行

逐行读取文本文件并选择随机行javascript

从文本文件中的随机行生成 URL?

Bash脚本读取文本文件中的随机行

如何显示文本文件中的随机行?

如何显示文本文件中的随机行?

从文本文件访问随机行 - Python