【发布时间】:2017-06-15 04:18:40
【问题描述】:
我有一个问题,我需要读取一个非常大的文件,然后打印每个块的解析结果。最后没有一个完整的列表。
到目前为止,我可以在 MapSet 中获得 uniq 结果,但无法弄清楚如何根据 chunk_size 写入文件
使用此方法获取唯一的文件名
def new_file_name do
hex = :crypto.hash(:md5, Integer.to_string(:os.system_time(:millisecond)))
|> Base.encode16
end
到目前为止,我拥有的最好的是这个,它给了我一个 MapSet 列表,其中包含块大小的独特结果。这是一个 MapSet 列表,最终可能会因内存太大而无法容纳。
def parse(file_path, chunk_size) do
file_path
|> File.stream!(read_ahead: chunk_size)
|> Stream.drop(1) # remove header
|> Stream.map(&"#{&1}\") # Prepare to be written as a csv
|> Stream.chunk(chunk_size, chunk_size, []) # break up into chunks
|> method # method to write per chunk to file.
end
我之前有的是
|> Stream.map(&MapSet.new(&1)) # Create MapSet of unique values from each chunk
但我似乎找不到任何将 MapSet 写入文件的示例。
【问题讨论】:
-
在调用
Enum函数或Stream.run/1之一之前不会进行任何计算。所以你可能想完成使用Enum.map而不是Stream.map -
从文档hexdocs.pm/elixir/MapSet.html看来,您唯一能做的就是将其转换为列表(使用
Mapset.to_list(map_set)),然后将其写入文件。我自己没有尝试过 - 所以如果您想稍后再读回数据,可能需要特别小心。 -
MapSet由什么组成?您想保留在新文件中的行吗?如果您放弃在MapSet中存储哪些数据的示例,这对您来说会是个问题吗?这将有助于理解问题和建议方法 -
@GavinBrelstaff 这是我尝试过的。帕维尔->是的。它只是一列字符串。没什么特别的。只是一个唯一字符串的 MapSet。我喜欢 MapSet.to_list 但如何为列表中的每个列表编写一个文件?
-
你能发布一个示例输入和输出吗?您想如何将 MapSet 中的元素写入文件?
标签: elixir