【问题标题】:Transpose of large csv file大csv文件的转置
【发布时间】:2017-04-05 17:46:55
【问题描述】:

我有一个约 15GB 的大型 CSV 文件,其中包含 180 万列和 5K 行。我需要对文件进行转置,或者是否有一种有效的方法可以逐列读取文件。在 python 2.7、bash 或 Matlab 中寻找时间和内存高效的解决方案。

CSV structure:

column names increment from f0,f1 to f1800000
each row has 1.8 million enteries with value of either 0 or 1.


---------------------------------------
 f0,f1,f2    .........    ,f1800000
---------------------------------------

 0,0,1       .........    ,0 
 1,0,1       .........    ,1 

 .........
---------------------------------------

【问题讨论】:

  • 您的规格是什么?尝试使用生成器。
  • 1.8*10^6*5000 是 9*10^9 单元格。 15 GB,即每个单元少于 2 个字节。你的数据类型是什么?文件非常稀疏吗?请添加详细规格。
  • 我已经更新了这个问题。请检查。
  • 一次读取 32 行(每个值是一位),转换为 1,800,000 个无符号整数,写入二进制文件。这样做大约 156 次。编写一个简单的程序,一次从每个文件中读取一个整数的所有 156 个文件,转换为 csv 语法(如果需要,添加行名),将这些行写入最终文件。
  • 如果每个值使用一位,则只有 1.125 GB 的数据。你应该能够记住它。将 8 行读入 8 个数组并将其转换为单个字节数组,一个字节代表 8 行单列。重复,直到您将所有数据保存在 625 个数组中。现在循环所有列并将它们作为行写入新文件。

标签: python bash matlab csv large-files


【解决方案1】:

这是一种有效的方法,使用 pandas,按小批量处理行:

import pandas as pd
NCOLS = 1.8e6  # The exact number of columns

batch_size = 50
from_file = 'my_large_file.csv'
to_file = 'my_large_file_transposed.csv'
for batch in range(NCOLS//batch_size + bool(NCOLS%batch_size)):
    lcol = batch * batch_size
    rcol = min(NCOLS, lcol+batch_size)
    data = pd.read_csv(from_file, usecols=range(lcol, rcol))
    with open(to_file, 'a') as _f:
        data.T.to_csv(_f, header=False)

【讨论】:

    猜你喜欢
    • 2020-11-06
    • 1970-01-01
    • 2021-06-18
    • 2020-09-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-19
    相关资源
    最近更新 更多