我正在构建一个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 ??)。所以,暂时,试图自己滚动。)
答案 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”归档器重新打包转储来解决问题。也许它可以帮助你。