1

我需要一个程序来读取文件的内容并将它们写入另一个文件,但只有有效的 utf-8 字符的字符。问题是文件可能采用任何编码,文件的内容可能对应也可能不对应这种编码。

我知道这是一团糟,但这就是我要处理的数据。我需要“清理”的文件可能高达几 TB,因此我需要程序尽可能高效。目前我正在使用我用 python 编写的程序,但清理 100gb 需要长达一周的时间。

我正在考虑使用 w_char 函数读取字符,然后将它们作为整数管理并丢弃所有不在某个范围内的数字。这是最佳解决方案吗?

还有什么是用 C/C++ 读写的最有效方法?

编辑:问题不在于 IO 操作,这部分问题旨在为拥有更快的程序提供额外帮助,但真正的问题是如何快速识别非 UTF 字符。另外,我已经尝试过腭化和 RAM 磁盘。

4

4 回答 4

1

utf8 只是一种很好的字符编码方式,并且具有非常明确的结构,因此从根本上来说,读取一块内存并验证它是否包含 utf8 是相当简单的。大多数情况下,这包括验证某些位模式不会出现,例如 C0、C1、F5 到 FF。(取决于位置)

在 C 中(对不起,不会说 python)编写简单的 fopen/fread 并检查每个字节的位模式相当简单,尽管我建议找到一些代码来剪切/粘贴(例如http://utfcpp .sourceforge.net/但我没有使用这些确切的例程),因为有一些警告和特殊情况需要处理。只需将输入字节视为无符号字符并直接对其进行位掩码。我会粘贴我使用的东西,但不是在办公室。

AC 程序将很快成为 IO 绑定的,因此如果您想要最终性能,那么有关 IO 的建议将适用,但是如果您做得对,像这样的直接字节检查将很难在性能上被击败。Utf8 很好,即使您从文件中间开始也可以找到边界,因此这很好地导致了并行算法。

如果您自己构建,请注意可能出现在某些文件开头的 BOM 掩码。

链接

http://en.wikipedia.org/wiki/UTF-8很好的清晰概述,表格显示了有效的位模式。

https://www.rfc-editor.org/rfc/rfc3629描述 utf8 的 rfc

http://www.unicode.org/ unicode 联盟主页。

于 2013-06-08T07:07:08.283 回答
0

根据我的说法,你最好的选择是并行化。如果您可以并行清理并同时清理许多内容,那么该过程将更有效率。我会研究一个并行化框架,例如 mapreduce,您可以在其中对任务进行多线程处理。

于 2013-06-07T01:18:03.530 回答
0

Unix/Linux 和任何其他 POSIX 兼容的操作系统都支持内存映射(mmap)。

于 2013-06-07T01:38:31.137 回答
0

我会查看内存映射文件。这是微软世界中的东西,不确定它是否存在于 unix 等中,但可能会。

基本上,您打开文件并将操作系统指向它,然后它将文件(或其中的一部分)加载到内存中,然后您可以使用指针数组访问该内存。对于 100 GB 的文件,您可能一次加载 1GB,处理然后写入内存映射的输出文件。

http://msdn.microsoft.com/en-us/library/windows/desktop/aa366556(v=vs.85).aspx

http://msdn.microsoft.com/en-us/library/windows/desktop/aa366542(v=vs.85).aspx

我认为这应该是执行大 I/O 的最快方法,但您需要进行测试才能确定。

HTH,祝你好运!

于 2013-06-07T01:23:59.743 回答