1

背景:我正在尝试将 3GB csv 文本文件(20M 行 x 46 col)加载到 SQLite 表中。数据导入失败并出现错误:“当表需要 46 个值时,记录 3,493,675 只有 2 个字段”。我想知道该记录是否只有 2 个字段(已损坏)或其他地方是否有问题(我的怀疑)。

所以我尝试使用 gawk 查看“违规”记录:

gawk -F, "NF<46 {打印 FNR,$1,NF}"

但收到一条错误消息(在运行 Windows 2008 的服务器上,具有 8 个 procs,16GB RAM | 我没有管理员权限):

“grow_top_buffer: iop->buf: 无法分配 1,073,741,826 字节的内存(空间不足)”。

我用谷歌搜索了这个错误,看到了一些 2003 年关于错误的帖子,但没有得到解决方案。

所以,问题来了:我的 4GB RAM Win 7 笔记本电脑上有相同的数据文件,并且相同版本的 gawk 工作正常——它读取整个 20M 记录……并且文件中的所有 20M 记录都有表所需的 46 个字段。

我尝试了几种不同的 gawk 语句,但在服务器上都失败了——都在我的电脑上工作。

问题:为什么在Win服务器上使用gawk缓冲内存错误?

谢谢,彼得

4

1 回答 1

2

如果服务器计算机运行 32 位版本的 Windows,而您的 PC 运行 64 位版本的 Windows,gawk 可能能够在您的 PC 上分配比服务器上更多的(虚拟)内存。这是因为它可能无法处理服务器上的内存量。

关于您的问题, awk 不应该需要大量内存来以您想要的方式处理文件。在我看来,这就像一个笨拙的错误。尝试其他版本的 awk,例如 Kernighan 的One True awk

于 2012-05-19T16:25:06.597 回答