python - 对行长度未知的大文件进行二进制搜索

标签 python database io binary-search large-files

我正在处理庞大的数据 CSV 文件。每个文件包含数百万条记录,每条记录都有一个键。记录按他们的键排序。在搜索 certian 数据时,我不想遍历整个文件。 我见过这个解决方案:Reading Huge File in Python

但它建议您在文件中使用相同长度的行 - 在我的情况下不支持。

我想过给每一行添加一个填充,然后保持固定的行长,但我想知道是否有更好的方法来做到这一点。

我正在使用 python

最佳答案

您不必拥有固定宽度的记录,因为您不必进行面向记录的搜索。相反,您可以只进行面向字节的搜索,并确保在进行搜索时重新对齐键。这是一个(可能有错误的)示例,说明如何将您链接到的解决方案从面向记录修改为面向字节:

bytes = 24935502 # number of entries
for i, search in enumerate(list): # list contains the list of search keys
  left, right = 0, bytes - 1 
  key = None
  while key != search and left <= right:
    mid = (left + right) / 2
    fin.seek(mid)
    # now realign to a record
    if mid:
        fin.readline()
    key, value = map(int, fin.readline().split())
    if search > key:
      left = mid + 1
    else:
      right = mid - 1
  if key != search:
    value = None # for when search key is not found
  search.result = value # store the result of the search

关于python - 对行长度未知的大文件进行二进制搜索,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8369175/

相关文章:

linux - 在状态 D 中杀死 linux 进程

python - 将键/值对的 Pyspark RDD 解析为 .csv 格式

python - Pandas Dataframe 合并多键

php - 将具有 130 万条记录的表从一个 MysQL 服务器移动到另一个(在不同的物理服务器上)

python - 是否可以在不指定数据库的情况下使用 SQLAlchemy 连接到 postgres 服务器?

python - 管理python中函数的输出数量

python - 在 python 中迭代 IOString 缓冲区

python - 查找并删除具有由第三个唯一特征标识的两个相同特征的重复数据条目

python - Websocket 到 Python 中的可用数据 - 从 GDAX websocket feed 获取价格

mysql - 在MySQL中实现继承:替代方案和仅具有代理键的表