Freebase RDF转储的C#解析只产生1150万N-Triples而不是19亿

时间:2014-02-19 00:42:32

标签: c# rdf freebase

我正在构建一个C#程序来读取Google Freebase data dump中的RDF数据。首先,我编写了一个简单的循环来简单地读取文件并获取三元组的计数。但是,我的程序只计算了大约1150万,然后退出,而不是像文档页面(上面提到的)那样获得19亿计数。下面给出了源代码的相关部分(运行大约需要30秒)。

我在这里缺少什么?

// Simple reading through the gz file
try
{
    using (FileStream fileToDecompress = File.Open(@"C:\Users\Krishna\Downloads\freebase-rdf-2014-02-16-00-00.gz", FileMode.Open))
    {
        int tupleCount = 0;
        string readLine = "";

        using (GZipStream decompressionStream = new GZipStream(fileToDecompress, CompressionMode.Decompress))
        {
            StreamReader sr = new StreamReader(decompressionStream, detectEncodingFromByteOrderMarks: true);

            while (true)
            {
                readLine = sr.ReadLine();
                if (readLine != null)
                {
                    tupleCount++;
                    if (tupleCount % 1000000 == 0)
                    { Console.WriteLine(DateTime.Now.ToShortTimeString() + ": " + tupleCount.ToString()); }
                }
                else
                { break; }
            }
            Console.WriteLine("Tuples: " + tupleCount.ToString());
        }
    }
}
catch (Exception ex)
{ Console.WriteLine(ex.Message); }

(我尝试使用GZippedNTriplesParser中的dotNetRdf来构建this recommendation来读取数据,但这似乎在开头RdfParseException右侧窒息(Tab分隔符?UTF-8 ??)。所以,暂时,试图自己滚动。)

3 个答案:

答案 0 :(得分:2)

Freebase RDF转储由map / reduce作业构建,可输出200个单独的Gzip文件。然后将这200个文件连接成一个最终的Gzip文件。 According to the Gzip spec,连接多个Gzip文件的原始字节将生成一个有效的Gzip文件。在解压缩该文件时,符合规范的库应该生成一个文件,其中包含每个输入文件的连接内容。

根据你看到的三元组的数量,我猜你的代码只是解压缩文件的第一个块而忽略了另一个199.我不是一个C#程序员而是阅读{ {3}}似乎切换到another Stackoverflow answer会解决此问题。

答案 1 :(得分:1)

我使用DotNetZip并为" gzip chunks"创建装饰类GzipDecorator。解决方法。

sealed class GzipDecorator : Stream
{
    private readonly Stream _readStream;
    private GZipStream _gzip;
    private long _totalIn;
    private long _totalOut;

    public GzipDecorator(Stream readStream)
    {
        Throw.IfArgumentNull(readStream, "readStream");
        _readStream = readStream;
        _gzip = new GZipStream(_readStream, CompressionMode.Decompress, true);
    }

    public override int Read(byte[] buffer, int offset, int count)
    {
        var bytesRead = _gzip.Read(buffer, offset, count);
        if (bytesRead <= 0 && _readStream.Position < _readStream.Length)
        {
            _totalIn += _gzip.TotalIn + 18;
            _totalOut += _gzip.TotalOut;
            _gzip.Dispose();
            _readStream.Position = _totalIn;
            _gzip = new GZipStream(_readStream, CompressionMode.Decompress, true);
            bytesRead = _gzip.Read(buffer, offset, count);
        }
        return bytesRead;
    }
}

答案 2 :(得分:0)

我设法通过使用“7-zip”归档器重新打包转储来解决问题。也许它可以帮助你。