【发布时间】:2015-09-26 12:48:12
【问题描述】:
我在 CSV 文件中有一个列 Original.csv,其中有一堆用户 ID,其中一些重复,如下所示:
udid
d0155049772de9
8b57d8c7f1e5a31e4adaef5fe6c52df1ada7fcd5
8b57d8c7f1e5a31e4adaef5fe6c52df1ada7fcd5
465088425ceb38c62bf8d1d9cc33bcfab4fe4293
3eabe40461773086
3eabe40461773086
e24356719f086021
212b5b0415560be3
1c046451a3761ef51fbf52759748f66c98b02313
我想稍后在 MATLAB 中处理它们,所以我想对它们进行哈希处理并将它们转换为整数并将它们存储在一个新文件中,New.csv。这是我的代码:
require 'csv'
udids = []
id=[]
CSV.foreach('Original.csv', :headers=>true).map do |row|
udids << row[0]
end
udids=udids.uniq
arrayHash=[]
for i in 0..udids.size-1
arrayHash<<udids
arrayHash<<i
end
hash = Hash[arrayHash.each_slice(2).to_a]
id=hash.values_at *udids
for i in 0..id.size-1
logfile = File.new('New.csv',"w")
logfile.print("#{id[i]}\n")
logfile.close
end
由于某种原因我无法弄清楚,运行代码后New.csv 文件为空。有什么问题?
编辑:这个程序的散列是否会比简单地比较和检查用户 ID 之前是否重复执行得更快?像这样的:
CSV.open('New.csv', "wb") do |csv|
CSV.foreach('Original.csv', :headers=>true).map do |row|
unless udids.include?(row[0])
udids << row[0]
end
csv<<udids.index(row[56]) + 1
end
end
在任何一种情况下,您能否说明为什么其中一种性能会比另一种更快?我的 CSV 有 6000 万条记录,如果这很重要的话。
【问题讨论】:
-
您在每次循环迭代中都会覆盖文件。
-
查找哈希元素比查找数组元素更快,尤其是在 6000 万行的情况下。但是在内存中保存整个哈希可能是个问题。
-
如果你写 udids.include?它会将您的元素与所有 6000 万个元素进行比较。如果你这样做 6000 万次,你就死定了。
-
这是一个 XY 问题。您在问如何解决一个糟糕的设计决策,即 Y。您的 X 问题应该是,处理 CSV 文件中的 6000 万行并查找特定记录的最佳方法是什么?将记录加载到磁盘上的 SQLite 数据库中,并使用 SQL 查找和提取数据。查看Sequel 了解管理此问题的好方法。该文档将使您快速启动并运行。将它们加载到 RAM 中是不可扩展的。